Rails — используя form_for и fields_for, как вы получаете доступ к подобъекту, находясь в блоке fields_for?

В моем первом приложении для рельсов я пытаюсь использовать 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>

person Don Leatham    schedule 18.02.2011    source источник


Ответы (2)


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

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

builder.object

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

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

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

person CharlieMezak    schedule 07.03.2011
comment
Все ссылки этого объекта на отношения не работают @CharlieMezak - person Marco Prins; 18.03.2016

То, как вы пытаетесь, не работает, потому что вы хотите получить доступ к 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 вам нужно использовать объект формы, который вы там определяете, в данном случае builder. Так как данные там отображаются не на внешнюю форму (f), а на объект cars (builder).

person Dan    schedule 18.02.2011
comment
Извините, Дэн, я должен был упомянуть, что builder.stall_number был первым, что я попробовал, но, к сожалению, используя его, я получаю: NoMethodError - неопределенный метод `stall_number' для #‹ActionView::Helpers::FormBuilder:0x00000102a1baf0›. Есть мысли, что это может означать? Спасибо! - person Don Leatham; 18.02.2011
comment
В вашем контроллере вы строите модели автомобилей! Тогда вам также нужно сослаться на них. Посмотрите на код, который я разместил. Для каждого киоска у вас должна быть своя подформа. @garage.stalls относится ко всем 5 киоскам, поэтому Ruby не знает, какой из них вы хотите использовать. Вы можете просто попробовать следующее: используйте свой код и замените :cars на @garage.cars[1] и измените car.stall_number на builder.stall_number. - person Dan; 18.02.2011