在 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
并返回user_path
而url_for(@user)
不是m_user_path
?
更新
因此,在将近 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
您还需要在除模型之外的任何地方删除对模块的引用M::User
。
最后,这里的目标是命名模型而不是视图和控制器。使用 esads 解决方案,模块M
(包含User
)被明确告知不要出现在路由中。因此,实际上,它M
被剥夺了,只剩下了User
。
用户模型现在可以驻留在app/views/models/m/user.rb
其中,用户控制器app/views/controllers/users_controller.rb
可以在其中找到,并且可以在 中找到视图app/views/users
。