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 は乗算されます。fields_forタグA1で2つ、 で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 に答える