Высушивание помощника: обертка form_for и доступ к локальной переменной формы - PullRequest
0 голосов
/ 28 июня 2011

Я пытаюсь высушить кучу кода форм, у которого есть повторяющийся набор полей, появляющихся в конце каждой формы. Я написал помощник, который оборачивается вокруг помощника form_for rails. Но я начинаю теряться в разных сферах, которые летают вокруг ...

Мой помощник выглядит примерно так:

def simple_form_helper(record_or_name_or_array, *args, &proc)
    options = ... # overriding some options, not relevant
    form_for(record_or_name_or_array, *(args << options.merge(:option => "blah")) , &proc)

    # i wish to access  &proc and append the call to render 
    # to within &procs scope (to access block local variable)
    concat render('shared/forms/submit')     # this obv does not work

end

в shared / forms / _submit.erb у меня есть несколько полей и кнопки отправки, которые являются общими для нескольких моделей. Поэтому я хочу, чтобы это отображалось в области видимости form_for, чтобы был доступ к f.

 f.text_field :foo
 f.hidden_field :bar
 f.submit "Save"

Идея состоит в том, чтобы использовать его так, как показано на изображениях:

simple_form_helper :object do |f|
  f.text_field :name
  f.text_field :description
  f.text_field :other_field
  # want common fields and submit button appended here

  # I could just call render("shared/forms/submit") here
  # but that does not seem very DRY. Or am I too unreasonable?
end

Так что он работает как старый добрый form_for: создает форму для некоторых: объект с полями, специфичными для него. А затем добавляет частичное с полями, которые являются общими для нескольких моделей.

Есть ли способ сделать это? Может быть, есть лучший способ?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

уверен, что это сработает

def simple_form_helper(record_or_name_or_array, *args)
   options = ... # overriding some options, not relevant
   form_for(record_or_name_or_array, *(args << options.merge(:option => "blah"))) do |f|
       yield f if block_given?
       concat f.text_field :foo
       concat f.hidden_field :bar
       concat f.submit "Save"  
   end
end

, и вы также можете вызвать simple_form_helper :object без блока, если вам не нужно добавлять какие-либо поля

2 голосов
/ 29 июня 2011

Вы также могли бы использовать частичное расположение, вот синтаксис для справки.

Макет частичный:

<%= form_for(record_or_name_or_array, :class => my_local_variable) do |f| %>
  <%= f.hidden_field :some_field %>

  <%= yield f %>

  <%= f.submit "Save" %>
<%- end %>

Шаблон или часть, где использовать макет:

<%= render :layout => "partial_layout_name", :locals => {:my_local_variable => value} do |f| %>

  <%= f.text_field :more_fields_here %>

<%- end %>
...