2008-12-16 7 views
14

así que tengo una forma de mi aplicación Rails que utiliza un FormBuilder a medida que me diera algunas etiquetas de campos personalizadosrieles AJAX: Mis necesidades parciales una instancia 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 %> 

Ahora bien, esto es parcial en un área del formulario que se reemplaza por una devolución de llamada AJAX. Lo que termino haciendo desde el controlador en respuesta a la petición AJAX es:

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

Sin embargo, si hago lo que entonces la forma se rompe, como el objeto FormBuilder que utilicé en la 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?

+0

Tengo este mismo problema con un creador de formularios normal, ¿seguiría usando los campos? – Joelio

Respuesta

14

Use fields_for dentro de su parcial. Realiza una tarea similar pero sin envolver las etiquetas de formulario. Vea el API docs.

+0

Hola, esto es lo que terminé haciendo al final :) Es un poco incómodo pero en realidad se siente mejor pasando objetos que formadores – Gareth

+29

Pero, ¿qué haces en la situación en la que realmente necesitas ese generador de formularios ahí? p.ej. cuando llamas a campos anidados (f.fields_for)? –

+5

¿Hubo alguna vez una solución para esto? @AndrewVit Todavía estoy atascado en este asunto 5 años después de tu comentario. – Donato

1

Usted puede crear una instancia de una nueva instancia de su constructor de la forma en el controlador, aunque se siente tipo de pésimo a mí:

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

Como alternativa, puede mover más de la lógica de actualización para ser parte del cliente, que wouldn No requiere 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.

2

¿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 es que necesita utilizar el fields_for anidado en el parcial

+0

Disculpa por esta publicación anterior, pero ¿qué ocurre con el archivo js.erb? ¿No es allí donde están los problemas? ¿Su código se refiere al archivo html.erb o js.erb? –

1

Tal vez soy un poco tarde en el juego aquí, y tal vez no entiende la pregunta correctamente, pero en ApplicationHelper.rb Creo que se puede simplemente añadir la línea:

ActionView::Base.default_form_builder = MyFormBuilder 
Cuestiones relacionadas