私の最初のRailsアプリでは、form_for
とfields_for
を使用してネストされたオブジェクトフォームを作成しようとしています。これまでのところは良いですが、私は理解できませんfields_for
ブロック内でサブオブジェクトにアクセスする方法サブオブジェクトのフィールドに、ユーザーの指示に表示するデータを事前に入力しました。
モデル
ガレージ:
has_many :cars, :dependent => :destroy
accepts_nested_attributes_for :cars
車:
belongs_to :garage
ガレージコントローラー
def new
@garage = Garage.new
for i in 1..5
@garage.cars.build :stall_number => i
end
end
_ form.html.erb
<%= form_for @garage do |f| %>
<%= f.label :title, "Garage Name" %><br />
<%= f.text_field :title %>
<% f.fields_for :cars do |builder| %>
<p>Enter license for car parked in stall: <%= car.stall_number %></p>
<%= f.label :license, "License #:" %><br />
<%= f.text_field :license %>
<%= end %>
<%= end %>
ご覧のとおり、:carsのビルダーブロック内で、ユーザーの指示に次のフィールドを表示したいと思います:car.stall_number
(コントローラーに整数を入力):
<p>Enter license for car parked in stall: <%= car.stall_number%></p>
@car.stall_number
、object.car.stall_number
など、さまざまなアイデアを試しました。喜びはありません。複数の検索とfields_for
ソースコードの確認は、私の理解に役立ちませんでした。ガイダンスをいただければ幸いです。
更新:明確にするために、ダンの提案に従って、私はbuilder.stall_number
を試しましたが、結果は
NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
私は今日自分でこれに対処しました。
Fields_forのオブジェクトには次の方法でアクセスできます。
builder.object
ここで、builderはfields_forフォームビルダーオブジェクトです。あなたの特定のケースでは、あなたは言うことができます:
<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p>
それはあなたのためにそれを行う必要があります!
あなたがしようとしている方法は、その変数にデータを入れずにcar
にアクセスしたいので機能しません。
ナンバープレートを入力できる複数の区画の屋台が必要だと思います。ストールごとに、独自のfields_for
。私はそのようなものを提案します:
<%= form_for @garage do |f| %>
<%= f.label :title, "Garage Name" %><br />
<%= f.text_field :title %>
<% for i in 1..5 %>
<% f.fields_for @garage.cars[i] do |builder| %>
<p>Enter license for car parked in stall: <%= builder.stall_number%></p>
<%= builder.label :license, "License #:" %><br />
<%= builder.text_field :license %>
<% end %>
<% end %>
<% end %>
Fields_for内では、そこで定義したフォームオブジェクト(この場合はビルダー)を使用する必要があります。データは外部フォーム(f)ではなく、carsオブジェクト(ビルダー)にマッピングされているためです。