Ответ 1
Используйте fields_for
внутри частичного. Он выполняет аналогичную задачу, но не обертывает теги формы. См. API-документы.
Итак, у меня есть форма в моем приложении 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?
Используйте fields_for
внутри частичного. Он выполняет аналогичную задачу, но не обертывает теги формы. См. API-документы.
как насчет этого?
@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 в частичном
Вы можете создать экземпляр нового экземпляра своего конструктора форм в контроллере, хотя для меня это выглядит как-то паршиво:
# in the controller
render :partial => {
:f => MyFormBuilder.new(:staff_member, @staff_member, template),
:skill_groups => @skill_groups,
:staff_member => @staff_member
}
В качестве альтернативы вы могли бы переместить больше логики обновления на клиентскую сторону, что не потребовало бы, чтобы вы вообще беспокоились о рендеринге. Вы можете просто обновить значения через JS. Не уверен, что это работает для вашего проекта.
Может быть, я немного опаздываю в игре здесь, и, может быть, я не понимаю вопрос правильно, но в ApplicationHelper.rb. Я думаю, вы можете просто добавить строку:
ActionView::Base.default_form_builder = MyFormBuilder
Вы можете отправить в свой адрес ajax содержимое f.object_name (он также работает с частичными) и использовать его для рендеринга тегов, определенных в http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html передавая его как первый аргумент.