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