Rails AJAX: моему частичному нужен экземпляр FormBuilder - PullRequest
15 голосов
/ 16 декабря 2008

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

<% form_for :staff_member, @staff_member, :builder => MyFormBuilder do |f| %>
[...]
    <%= render :partial => "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %>  
[...]
<% end %>

Теперь этот фрагмент находится в области формы, которая заменяется обратным вызовом AJAX. В результате я получаю от контроллера ответ на запрос AJAX:

render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member}

Однако, если я сделаю это, форма сломается, так как объект FormBuilder, который я использовал в form_for, больше не доступен. Могу ли я использовать свой собственный объект FormBuilder внутри части, используемой для обратного вызова AJAX?

Ответы [ 5 ]

14 голосов
/ 02 января 2009

Используйте fields_for внутри вашего частичного. Он выполняет аналогичную задачу, но без переноса тегов формы. См. API документы .

2 голосов
/ 19 октября 2010

как насчет этого?

  @template.with_output_buffer do
    @template.form_for @model_object do |f|
      f.fields_for :some_nested_attributes do |ff|
        render :partial => 'nested_attributes', :object => @model_object, :locals => {:form => ff}
      end
    end
  end

это было бы особенно полезно, если вам нужно использовать вложенные fields_for в частичном

1 голос
/ 20 ноября 2013

Вы можете передать внутри вашего ajax-вызова содержимое f.object_name (оно также работает с частями) и использовать его для отображения тегов, определенных в http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html, передавая его в качестве первого аргумента.

1 голос
/ 22 октября 2010

Может быть, я немного опаздываю в игре здесь, и, возможно, я не правильно понимаю вопрос, но в ApplicationHelper.rb я думаю, что вы можете просто добавить строку:

ActionView::Base.default_form_builder = MyFormBuilder
1 голос
/ 01 января 2009

Вы можете создать новый экземпляр вашего конструктора форм в контроллере, хотя мне это кажется паршивым:

# in the controller
render :partial => {
  :f => MyFormBuilder.new(:staff_member, @staff_member, template),
  :skill_groups => @skill_groups,
  :staff_member => @staff_member
}

В качестве альтернативы, вы можете переместить больше логики обновления на сторону клиента, что не потребует от вас никакого беспокойства по поводу рендеринга вообще. Вы можете просто обновить значения через JS. Не уверен, что это работает для вашего проекта.

...