也许这里有人能帮帮我。
我有以下模型vehicle.rb
:
class Vehicle < ActiveRecord::Base
attr_accessible :parameters_attributes
has_many :parameters, dependent: :destroy
accepts_nested_attributes_for :parameters, reject_if: lambda {
|attrs| attrs.all? {
|tag, value|
value.is_a?(Integer)
tag.blank?
}
}
end
vehicles_controller.rb
def new
@vehicle = Vehicle.new
end
和在我看来new.html.haml
:
= form_for [:admin, setup(@vehicle)], html: { multipart: true } do |f|
%fieldset{ data: { hook: "new_vehicle" } }
%legend{ align: "center" }
= t(:new_vehicle)
= render partial: 'shared_vehicle_fields', locals: { f: f }
= f.field_container :size do
= f.label :size
%span.required *
%br/
= f.select :size, [t(:please_select) , "small", "medium", "large"], class: 'require'
.parameter_fields
%div.small_vehicle_parameters
= f.fields_for :parameters do |pf|
= render 'parameter_fields', f: pf, text: 'A1'
= f.fields_for :parameters do |pf|
= render 'parameter_fields', f: pf, text: 'A2'
%div.medium_vehicle_parameters
%div.large_vehicle_parameters
%br/
= f.submit t(:submit)
setup(@vehicle)
是以下助手:
def setup(vehicle)
returning(vehicle) do |car|
car.parameters.build if car.parameters.blank?
end
end
部分parameter_fields
没有什么特别的,但我将展示它,以防万一:
= f.label :tag, text
= f.text_field :value, size: 4
= f.hidden_field :tag, { value: text }
%br/
现在,问题是:
当我在表单的任何字段中输入正确的值时,一切都很好。它创建了我想要的模型和记录。但是,如果任何验证没有通过,则会再次呈现表单并显示错误消息。但是,参数text_fields是相乘的。我得到2 fields_for
与标签A1
和2字段与tag
A2
。如果我有3个fields_for
,那么每个都有3个,以此类推。
我知道我需要在表中创建多少记录(取决于车辆大小),如果这有帮助的话。
帮助,有人知道吗?
对于任何可能遇到类似问题并像我一样震惊的人....
发生的事情是,在验证失败后,@vehicle.parameters
有一个他想要创建的记录列表,这反过来又使页面上的每个fields_for
呈现相同数量的text_fields
。这就是它的原理,Ruby on Rails在这方面很聪明。这在编辑表单时很方便。他自动呈现"正确"数量的字段。至少我是这样理解这个问题的。
无论如何,如果save
不成功,我已经在create
操作中添加了以下行。
@vehicle.parameters = []