rails 3 fields_for嵌套形成多个记录

时间:2013-05-16 14:34:46

标签: ruby-on-rails-3 nested-attributes fields-for multiple-records

也许这里有人会帮助我。

我有以下模型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个,依此类推。

我知道我需要在表格中创建多少条记录(取决于车辆大小),如果有帮助的话。

帮助,有人吗?

1 个答案:

答案 0 :(得分:1)

对于任何可能遇到类似问题但被我震惊的人而言......

在验证失败后,@vehicle.parameters有一个他想要创建的记录列表,而这又为每个text_fields提供了fields_for的记录。在页面上。这就是如何制作的,Ruby on Rails就像这样聪明。编辑表单时这很方便。他自动呈现“正确”的字段数量。至少这就是我理解这个问题的方式。

无论如何,如果create失败,我在save操作中添加了以下行。

@vehicle.parameters = []