Ruby on rails Rails从对象创建路由
我有一个routes文件,看起来像这样(嵌套非常深…我知道): 当运行Ruby on rails Rails从对象创建路由,ruby-on-rails,ruby,routing,ruby-on-rails-4,Ruby On Rails,Ruby,Routing,Ruby On Rails 4,我有一个routes文件,看起来像这样(嵌套非常深…我知道): 当运行rake routes时,我会返回所有路由,包括一个名为breatdh\u area\u sequences(这正是我想要的)。问题是,当我创建表单时,rails根据我提供的参数构建了错误的url: = form_for [:breadth, breadth_sequence.area, breadth_sequence] do |f| ... 这给了我: undefined method `breadth_breadt
rake routes
时,我会返回所有路由,包括一个名为breatdh\u area\u sequences
(这正是我想要的)。问题是,当我创建表单时,rails根据我提供的参数构建了错误的url:
= form_for [:breadth, breadth_sequence.area, breadth_sequence] do |f|
...
这给了我:
undefined method `breadth_breadth_area_breadth_sequences_path' for #<#<Class:0x007fe55bcf16b8>:0x007fe55d9a3f68>
未定义的方法“宽度、宽度、面积、宽度、序列、路径”#
rails究竟是如何获取这个参数数组并从中创建URL路径的?我假设它对每个对象调用一个方法?这是我可以覆盖的东西,以便获得我期望的命名路由(而不是覆盖:form_for上的url)因为您想以不同于路由的方式命名对象,所以它不起作用。如果您的模型是
BreadthArea
(正如路线所认为的那样),则路线/控制器的命名需要与模型的命名相同您的路线也应该以同样的方式命名。为了完成这项工作,我必须在面包圈
和面包序列
上覆盖self.model_name
方法。此方法是当在第一个参数中使用对象(或对象数组)时,form\u for
计算URL的方法
class BreadthArea < ActiveRecord::Base
def self.model_name
ActiveModel::Name.new(self, nil, "Area")
end
...
end
class BreadthSequence < ActiveRecord::Base
def self.model_name
ActiveModel::Name.new(self, nil, "Sequence")
end
...
end
class-BreadthArea
您可以尝试“form\u for Width\u area\u sequences\u path”,我可以,但取决于Width\u sequence
是否为新记录,此URL将更改(Width\u area\u sequence\u path
用于现有记录,Width\u area\u sequences\u path
用于新对象)。我希望rails能够在不指定URL的情况下自己解决这个问题。事实并非如此。请看我的解决方案(不是最优雅的,但肯定有效)。更改广泛使用的模型名可能会对您的代码库产生其他影响,我不建议这样做,因为很多代码都依赖于这些信息。
class BreadthArea < ActiveRecord::Base
def self.model_name
ActiveModel::Name.new(self, nil, "Area")
end
...
end
class BreadthSequence < ActiveRecord::Base
def self.model_name
ActiveModel::Name.new(self, nil, "Sequence")
end
...
end