Ruby on rails 用于和命名空间模型的Rails url_
在Rails中,是否可以在模块中命名模型,并且仍然可以从的Ruby on rails 用于和命名空间模型的Rails url_,ruby-on-rails,ruby-on-rails-3,namespaces,url-for,Ruby On Rails,Ruby On Rails 3,Namespaces,Url For,在Rails中,是否可以在模块中命名模型,并且仍然可以从的url\u获得正确的行为 例如,在这里,的url\u按预期工作: # 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 是否可以让url\u for忽略M::User中
url\u获得正确的行为
例如,在这里,
的url\u按预期工作:
# 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
是否可以让url\u for
忽略M::User
中的模块,并为url\u for(@User)
返回User\u路径
,而不是M\u User\u路径
更新
因此,在将近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
#app/models/m/user.rb
模块M
类用户
注意:使用bin/rails g scaffold m/user
生成模型、视图和控制器时,视图和控制器也将使用名称空间。您需要将app/views/m/users
移动到app/views/users
和app/controllers/m/users\u controller.rb
移动到app/controllers/users\u controller.rb
;您还需要删除对模块M
的引用,模型M::User
中除外
最后,这里的目标是命名模型,而不是视图和控制器。使用esads解决方案,模块M
(包含用户
)被明确告知不会出现在路由中。因此,有效地,去除M
,并且只剩下用户
用户模型现在可以位于app/views/models/m/user.rb
,用户控制器位于app/views/controllers/users\u controller.rb
,视图可以在app/views/users
Use中找到
namespace "blah" do
resources :thing
end
然后将适当地命名路线
rake routes
要查看所有路由,请指定路由上的模块
resources :users, :module => "m"
或者使用scope来完成它
scope :module => "m" do
resources :users
end
只需在包含模块中定义使用\u relative\u model\u naming?
,以避免在生成的路由名称前加前缀:
module M
def self.use_relative_model_naming?
true
end
end
在我的例子中,我覆盖了我的application\u helper.rb文件上的url\u 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
谢谢,我试过了,但没有解决问题:虽然url_for获得了关于模型名称空间的信息,但是路由(控制器)将被调整为使用相同的名称空间——这不是我需要的。因此:是否可以设置路由以使用位于不同名称空间中的模型和控制器?换句话说,有没有一种方法可以在不接触控制器路由的情况下影响给定模型实例的url_行为?例如,模型M::User将在app/models/M/User.rb中定义,而控制器将在app/controllers/User\u controller.rb中定义。此外,如果它不是RESTFul资源,您会怎么做?我有这个问题,我正在处理的控制器不能被塞进资源中。资源:things do(新行)获取“foo”=>“controller#action”。这不是正确的答案,请参阅上面的编辑。所要求的是:将模型放在模块中,不使用名称空间视图和控制器。在您的解决方案中,模型、视图和控制器都必须具有名称空间。工作非常完美!谢谢:)这是金色的!准确地解决了OP所要求的(以及我所寻找的)感谢这个方法应该是Rails API中记录的第一个方法!self(和其他人)注意:这必须在模块中,即名称空间本身,而不是在类中。
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