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