Rails AJAX: моей частичной части требуется экземпляр FormBuilder

Итак, у меня есть форма в моем приложении 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?

Ответ 1

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

Ответ 2

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

  @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

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

Ответ 3

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

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

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

Ответ 4

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

ActionView::Base.default_form_builder = MyFormBuilder

Ответ 5

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