web-dev-qa-db-ja.com

Rails-form_forとfields_forを使用して、fields_forブロック内でサブオブジェクトにアクセスするにはどうすればよいですか?

私の最初のRailsアプリでは、form_forfields_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_numberobject.car.stall_numberなど、さまざまなアイデアを試しました。喜びはありません。複数の検索とfields_forソースコードの確認は、私の理解に役立ちませんでした。ガイダンスをいただければ幸いです。

更新:明確にするために、ダンの提案に従って、私はbuilder.stall_numberを試しましたが、結果は

NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
45
Don Leatham

私は今日自分でこれに対処しました。

Fields_forのオブジェクトには次の方法でアクセスできます。

builder.object

ここで、builderはfields_forフォームビルダーオブジェクトです。あなたの特定のケースでは、あなたは言うことができます:

<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p>

それはあなたのためにそれを行う必要があります!

81
CharlieMezak

あなたがしようとしている方法は、その変数にデータを入れずに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オブジェクト(ビルダー)にマッピングされているためです。

3
Dan