Подтвердить что ты не робот

Rails - using form_for и fields_for, как вы получаете доступ к под-объекту в поле fields_for?

В моем первом приложении 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 не помогли мне понять. Буду признателен за любые рекомендации.

Обновление:. Для пояснения, для предложения Dan Dan, я пробовал builder.stall_number, но это приводит к

NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
4b9b3361

Ответ 1

Я просто занимался этим сегодня.

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

builder.object

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

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

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

Ответ 2

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