Rails从对象创建路由

时间:2013-12-04 20:36:10

标签: ruby-on-rails ruby routing ruby-on-rails-4

我有一个看起来像这样的路线文件(它非常嵌套......我知道):

  scope :admin, module: :admin do
    namespace :breadth do
      resources :areas, as: 'areas' do
        resources :sequences, as: 'sequences'
      end
    end
  end

当运行rake routes时,我得到了所有路线,包括一个名为breatdh_area_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)

2 个答案:

答案 0 :(得分:0)

由于您希望以不同于路线的方式命名对象,因此无法使用。您的路线/控制器需要在模型命名时命名,如果您的模型是BreadthArea(如路线所认为的那样),您的路线也应以相同的方式命名。

答案 1 :(得分:0)

为了完成这项工作,我必须覆盖self.model_nameBreadthArea上的BreadthSequence方法。此方法是form_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