Rails - Как использовать form_for и fields_for, как вы получаете доступ к подобъекту, находясь в блоке fields_for? - PullRequest
44 голосов
/ 18 февраля 2011

В моем первом приложении 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 %>

Как вы можете видеть, внутри блока builder для: 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>

Ответы [ 2 ]

80 голосов
/ 07 марта 2011

Я только что разобрался с этим сегодня сам.

Вы можете получить доступ к объекту fields_for через:

builder.object

где builder - это ваш fields_for объект построителя форм. В вашем конкретном случае вы можете сказать:

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

Это должно сделать это для вас!

3 голосов
/ 18 февраля 2011

То, как вы пытаетесь, не работает, потому что вы хотите получить доступ к 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), а с объектом автомобилей (строитель).

...