Rails 3 fields_for嵌套表单多个记录



也许这里有人能帮帮我。

我有以下模型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 = []

相关内容

  • 没有找到相关文章

最新更新