16

在 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_pathurl_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/usersapp/views/usersapp/controllers/m/users_controller.rbapp/controllers/users_controller.rbM您还需要在除模型之外的任何地方删除对模块的引用M::User

最后,这里的目标是命名模型而不是视图和控制器。使用 esads 解决方案,模块M(包含User)被明确告知不要出现在路由中。因此,实际上,它M被剥夺了,只剩下了User

用户模型现在可以驻留在app/views/models/m/user.rb其中,用户控制器app/views/controllers/users_controller.rb可以在其中找到,并且可以在 中找到视图app/views/users

4

4 回答 4

28

只需use_relative_model_naming?在包含模块中定义以避免为生成的路由名称添加前缀:

module M
  def self.use_relative_model_naming?
    true
  end
end
于 2012-11-22T22:42:24.787 回答
4

采用

namespace "blah" do
  resources :thing
end

然后将适当地命名路线。

rake routes

查看所有路线

于 2010-12-10T00:08:03.600 回答
3

指定路由上的模块

resources :users, :module => "m"

或使用范围来做到这一点

scope :module => "m" do
  resources :users
end
于 2011-01-04T12:42:04.090 回答
0

在我的例子中,我覆盖了我的 application_helper.rb 文件上的 url_for 方法,以在我的命名空间 :mkp 的所有路由上添加 :network 参数。

module ApplicationHelper
  def url_for(options = {})
    if options.is_a?(Hash) && options.has_key?(:controller)
      if options[:network].nil? && options[:controller].match(/^mkp\//).present?
        options[:network] = @network.downcase
      end
    end
    super(options)
  end
end
于 2013-03-27T21:44:54.957 回答