seb*_*ian 13 namespaces ruby-on-rails url-for ruby-on-rails-3
在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
Run Code Online (Sandbox Code Playgroud)
将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'
Run Code Online (Sandbox Code Playgroud)
是否有可能有url_for忽略模块M::User,并返回user_path用于url_for(@user)代替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
Run Code Online (Sandbox Code Playgroud)
注意:在生成模型,视图和控制器时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.
esa*_*sad 24
只需use_relative_model_naming?在包含模块中定义,以避免为生成的路由名称添加前缀:
module M
def self.use_relative_model_naming?
true
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4509 次 |
| 最近记录: |