在Rails中,模块中的命名空间模型是否可以从url_for获取正确的行为?
例如,这里,url_for按预期工作:
# app/models/user.rb class User < ActiveRecord::Base end # config/routes.rb resources :users # app/views/users/index.html.haml = url_for(@user) # /users/1
而将User模型放入模块之后,url_for就抱怨一个未定义的方法m_user_path:
# app/models/m/user.rb module M class User < ActiveRecord::Base end end # config/routes.rb resources :users # app/views/users/index.html.haml = url_for(@user) # undefined method 'm_users_path'
是否可以让url_for忽略M :: User中的模块,并返回url_for(@user)的user_path而不是m_user_path?
UPDATE
所以,经过近5年,这里是解决方案,谢谢esad.这已经在Rails 4.2中进行了测试.
# app/models/m/user.rb module M class User < ActiveRecord::Base end end # app/models/m.rb module M def self.use_relative_model_naming? true end def self.table_name_prefix 'm_' end end # config/routes.rb resources :users # app/views/users/index.html.haml = url_for(@user) # /users/1
注意:当使用bin / rails g scaffold m / user生成模型,视图和控制器时,视图和控制器也将被命名.您需要将app / views / m / users移动到app / views / users和app / controllers / m / users_controller.rb到app / controllers / users_controller.rb;除了模型M :: User之外,您还需要删除对模块M的引用.
最后,这里的目标是命名空间模型,而不是视图和控制器.使用esad解决方案,模块M(包含用户)被明确地告知不出现在路由中.因此,有效地,M被剥离,只有用户遗留.
用户模型现在可以驻留在app / views / models / m / user.rb中,用户控制器驻留在app / views / controllers / users_controller.rb中,并且可以在app / views / users中找到这些视图.