加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:57:30 所属栏目:百科 来源:网络整理
导读:在Rails中,模块中的命名空间模型是否可以从url_for获取正确的行为? 例如,这里,url_for按预期工作: # app/models/user.rbclass User ActiveRecord::Baseend# config/routes.rbresources :users# app/views/users/index.html.haml= url_for(@user) # /users/
在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读