如何通过关联为has_many创建嵌套资源的表单?

时间:2019-04-21 15:55:37

标签: ruby-on-rails

我在创建正确的form_with语法以通过关联为has_many创建记录时遇到麻烦,并且找不到要复制的示例。

我的模特有一个工厂。工厂可以有设备。设备可以具有许多EquipmentVariation。变体特定于特定类型的设备,但每个特定的设备都不同(因此VariationType与EquipmentType相关联)

我可以创建工厂(例如localhost / factories / 1) 我可以在工厂创建设备(例如localhost / factories / 1 / equipment / 1)

但是我无法创建可创建EquipmentVariations的表格。也就是说,当我导航到localhost / factories / 1 / equipment / 1时,我想要一个窗体将EquipmentVariations添加到该Equipment条目。

这是我的代码:

routes.rb

    resources :factories do
        resources :equipment do
            resources :equipment_variations
        end
    end

    resources :equipment_types do
        resources :variation_types
    end

模型

class Factory < ApplicationRecord
    has_many :equipment
end

class Equipment < ApplicationRecord
    belongs_to :factory
    belongs_to :equipment_type
    has_many :equipment_variations
    has_many :variation_types, through: :equipment_variations
end

class EquipmentVariation < ApplicationRecord
  belongs_to :equipment
  belongs_to :variation_type
end

class VariationType < ApplicationRecord
    belongs_to :equipment_type
    has_many :equipment_variations
    has_many :equipment, through: :equipment_variations
end

app / views / equipment / show.html.erb中的视图

<h1><%= @equipment.equipment_type.name %></h1>

<h3>Add Variation</h3>
<%= form_with(model: [@equipment, VariationType.new], url: factory_equipment_equipment_variations_path, local: true) do |form| %>

<%= form.submit %>

<% end %>

这与我所能管理的接近,但是给出了错误:没有路由匹配{:action =>“ index”,:controller =>“ equipment_variations”,:factory_id =>“ 2”,:id =>“ 3”},缺少必需的键:[:equipment_id]

基本上,我需要能够从/ factories / 1 / equipment / 1页面上发布到URL / factories / 1 / equipment / 1 / equipment_variations。为此给出的路由是factory_equipment_equipment_variations,这就是为什么我在url参数中指定该路由的原因,但是我觉得必须有一种更简单的方法来实现这一目标。 form_with参数应该是什么样?

1 个答案:

答案 0 :(得分:0)

好,所以我知道了。我很近,但是正确的语法如下

<%= form_with(model: [@factory, @equipment, EquipmentVariation.new], local: true) do |form| %>

因此,您需要给模型提供参数:对路线(工厂,设备)的所有模型进行参数设置,它将自己找出正确的路径并适当地提交参数。

此外,我上面所说的EquipmentVariation控制器看起来像:

def create
        @equipment = Equipment.find(params[:equipment_id])
        @equipment.variation_types << VariationType.find(params[:variation_type][:variation_type_id])
    end

希望这对以后的人有帮助!