ruby on rails - form_with - Rails AJAX: Mi parcial necesita una instancia de FormBuilder
select in ruby on rails (5)
Así que tengo un formulario en mi aplicación de Rails que usa un FormBuilder personalizado para darme algunas etiquetas de campo personalizadas
<% 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 %>
Ahora, este parcial está en un área de la forma que se reemplaza por una devolución de llamada AJAX. Lo que termino haciendo desde el controlador en respuesta a la solicitud de AJAX es:
render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member}
Sin embargo, si hago eso, el formulario se rompe, ya que el objeto FormBuilder que utilicé en form_for ya no está disponible. ¿Hay alguna forma de que use mi objeto FormBuilder personalizado dentro de un parcial utilizado para una devolución de llamada AJAX?
Puede instanciar una instancia nueva de su creador de formularios en el controlador, aunque me parece un poco asqueroso:
# in the controller
render :partial => {
:f => MyFormBuilder.new(:staff_member, @staff_member, template),
:skill_groups => @skill_groups,
:staff_member => @staff_member
}
Alternativamente, podría mover más de la lógica de actualización al lado del cliente, lo que no requeriría que se preocupe por representar nada en absoluto. Podrías actualizar los valores a través de JS. Sin embargo, no estoy seguro si eso funciona para su proyecto.
Use fields_for
dentro de su parcial. Realiza una tarea similar pero sin envolver las etiquetas de formulario. Ver los documentos API .
¿Qué tal esto?
@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
esto sería especialmente útil si necesita usar los campos anidados_para en el parcial
Quizás estoy un poco retrasado en el juego aquí, y tal vez no entiendo la pregunta correctamente, pero en ApplicationHelper.rb creo que puedes agregar la línea:
ActionView::Base.default_form_builder = MyFormBuilder
Puede enviar dentro de su llamada ajax el contenido de f.object_name (también funciona con parciales) y usarlo para representar las etiquetas definidas en http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html pasándolo como el primer argumento