Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 用于和命名空间模型的Rails url__Ruby On Rails_Ruby On Rails 3_Namespaces_Url For - Fatal编程技术网

Ruby on rails 用于和命名空间模型的Rails url_

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中

在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 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