【发布时间】:2011-05-23 05:04:12
【问题描述】:
在 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?
更新
所以,在将近 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 的引用。
最后,这里的目标是命名模型而不是视图和控制器。使用 esads 解决方案,模块M(包含User)被明确告知不要出现在路由中。因此,实际上,M 被删除,只剩下User。
用户模型现在可以位于app/views/models/m/user.rb,用户控制器位于app/views/controllers/users_controller.rb,视图可以在app/views/users中找到。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 namespaces url-for