0

也许这里有人会帮助我。

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

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

帮助,有人吗?

4

1 回答 1

1

对于任何可能遇到类似问题并且像我一样震惊的人......

发生的情况是,在验证失败后,@vehicle.parameters他有一个他想要创建的记录列表,这反过来又会为页面上的text_fields每个记录呈现该数量。fields_for这就是它的制作方法,Ruby on Rails 就是这样聪明的。这在编辑表单时很方便。他会自动呈现“正确”数量的字段。至少我是这样理解问题的。

create无论如何,如果save不成功,我会在操作中添加以下行。

@vehicle.parameters = []
于 2013-05-17T09:01:33.887 回答