Вспомогательный метод, который инкапсулирует два блока form_for - PullRequest
0 голосов
/ 01 ноября 2009

Как создать вспомогательный метод, который выглядит как

-confirmation_for [@post, @comment] do |f|
  = f.confirm "Post"
  %p html here...
  = f.edit    "Edit"

и инкапсулирует две формы, такие как

-form_for [@post, @commment] do |f|
  = f.hidden_field :submission_state, :value => "confirmed"
  = f.submit "Post"
%p html here...
-form_for [@post, @commment] do |f|
  = f.hidden_field :submission_state, :value => "edit_requested"
  = f.submit "Edit"

1 Ответ

0 голосов
/ 01 ноября 2009

Я не думаю, что есть способ получить именно то, что вы ищете, без переопределения form_for. Или написать свою собственную версию.

Вы можете сблизиться с FormBuilders, Partials или Helpers, но ни одна из этих концепций сама по себе не позволит вам делать то, что вы хотите.

FormBuilder позволит вам определять методы, которые будут вызываться в форме, такие как подтверждение и редактирование, но они будут частью одной и той же формы. Если вы не создадите две формы.

В соответствующем вспомогательном файле:

class ExampleFormBuilder < ActionView::Helpers::FormBuilder    

  def confirm
    hidden_field(:submission_state, :value => "confirmed") + "\n" + submit "Post"
  end

  def edit
    hidden_field(:submission_state, :value => "edit_requested") + "\n" + submit "Edit"
  end


end

Пример использования:

- form_for [@posts,@comments], :builder => ExampleFormBuilder do |f|
  = f.confirm
- form_for [@posts,@comments], :builder => ExampleFormBuilder do |f|
  = f.edit

При использовании с частичным вы можете сделать что-то вроде этого

частично:

- form_for [@posts,@comments], :builder => ExampleFormBuilder do |f|
  = f.send(action)

просмотр:

= render :partial => :confirmation_for, :locals => {:action => :confirm}
= render :partial => :confirmation_for, :locals => {:action => :edit}

Затем можно объединить оба частичных вызова в другой частичный. Но это заходит слишком далеко.

...