Передать экземпляр или локальную переменную из макета для просмотра в Rails
Я пытаюсь настроить довольно сложную форму, используя form_for
, Эта форма должна находиться в нескольких представлениях, где некоторые поля будут доступны для всех действий, а другие - для каждого отдельного действия.
Я думал, что для того, чтобы избежать дублирования кода, я использовал макет для рендеринга общей части, например так:
# layout.html.erb
<%= form_for @instance do |f| %>
<%= f.text_field :foo %><!-- This field needs to be available in all views -->
<...><!-- Additional non-form related html -->
<%= yield %>
<%= f.submit %>
<% end %>
# first_view.html.erb
<% f.fields_for :bar do |b| %>
<%# Fields %><!-- These fields should only be available in first_view -->
<% end %>
# second_view.html.erb
<% f.text_field :baz %><!-- This field should only be available in second_view -->
Теперь проблема в том, что я не могу пройти f
как локальная переменная от макета до представления. Я даже не могу установить переменную экземпляра (например, @f = f
) и доступ к нему в представлениях.
Как я мог это сделать? Любые предложения по улучшению реализации будут приветствоваться.
2 ответа
В конце концов, я решил пойти с простым, надежным решением. Я сейчас переехал form_for
в отдельные виды, и положить общие поля в частичную. Это означает, что я должен дублировать form_for
а также рендеринг частичного, но я могу жить с этим.
Не могли бы вы извлечь форму в частичное, которое принимает поля ':bar' или ':baz' как локальное, которое передается представлением, отображающим этот частичный элемент?
т.е.
render :partial => 'complex_form' :locals => { :text_field_param => :bar }
Вышеуказанная строка будет вызываться в first_view, а частичное будет содержать всю логику и разметку формы, используя text_field_param для специализированного текстового поля.