Передать экземпляр или локальную переменную из макета для просмотра в 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 для специализированного текстового поля.

Другие вопросы по тегам