我在创建正确的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参数应该是什么样?
答案 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
希望这对以后的人有帮助!