ruby-on-rails – Rails url_for和命名空间的模型

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails url_for和命名空间的模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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中找到这些视图.

解决方法

只需定义use_relative_model_naming?在包含模块中避免为生成的路由名称添加前缀:
module M
  def self.use_relative_model_naming?
    true
  end
end

猜你在找的Ruby相关文章