7

Estoy intentando crear dinámicamente elementos de formulario dada una determinada solicitud de AJAX.Pasar ActionView :: Helpers :: FormBuilder a un número parcial

Esta es mi configuración:

Ver:

<%= link_to 'Next', check_unique_id_students_path, :remote => true %> 

    <div id="guardian_student_details"></div> 

Controlador:

def check_unique_id 
    @student = Student.new 
    @this_form = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{}) 
    end 

JS:

jQuery("#guardian_student_details").html("<%=escape_javascript(render :partial => "student_details", :locals => { :s => @this_form }) %>"); 

parcial:

<% puts s.text_field :first_name %> 
<% puts s.field_helpers %> 

el objeto de depurar coloqué las siguientes líneas en el comienzo de mi parcial:

<% puts s.class.to_s %> 
<% puts s.object.to_s %> 

Esto muestra:

ActionView::Helpers::FormBuilder 
Student 

Esto debería funcionar. Sin embargo carriles está dando el siguiente error:

ActionView::Template::Error (undefined method `text_field' for nil:NilClass): 
1: <% puts s.class.to_s %> 
2: <p> 
3: <%= s.text_field :first_name, :class => 'text_input is_empty' %> 
4: <%= s.label :first_name %><strong>*</strong> 
5: </p> 
6: 

app/views/estudiantes/_student_details.html.erb: 3: _app_views_students__student_details_html_erb__2485891544130782916_2214680440' app/views/students/check_unique_id.js.erb:2:in en _app_views_students_check_unique_id_js_erb__3504800328150418937_2214933160'

lo que implica que "s" es algo que NIL verificado sólo 2 líneas antes ¿Alguien tiene alguna idea? No sé si esto tiene algo que ver con la variable "@template" inicializada en el controlador. Con lo que jugué y acepté prácticamente cualquier cosa, y si se imprime es nulo. Cualquier ayuda sería apreciada. Gracias

Nota final:

Me trataron de poner en práctica esta: AJAX update of accepts_nested_attributes_for partials

Respuesta

0

Prueba esto en una consola:

s = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{}) 
s.text_field :first_name 

Usted tendrá el mismo error. Creo que el problema proviene de tu creación del objeto form_builder, incluso si no conozco el error exacto ...

Me parece que tu solución es un poco compleja. Puede probar esta solución:

#html.erb 
<% form_for @student do |f| %> 
    <div id='guardian_student_details' class='hide-this-block'> 
    <%= render :partial => "student_details", :locals => { :s => f }) %> 
    </div> 
<% end %> 

#js 
jQuery("#guardian_student_details").show(); 

En general, prefiero mantener JavaScript y Ruby separado.

+0

Gracias Alexandre, sé que esto funciona, pero mi funcionalidad se beneficiaría mucho si pudiera hacerlo de la manera propuesta con FormBuilder. – jalagrange

+0

¿Es esto en Rails 2.3 o 3+? No estoy seguro de si la variable @template existe en Rails 3. Con la publicación de actualización AJAX que mencionaste he cambiado el código desde que publiqué ese método. Al final utilicé una versión modificada de http://media.pragprog.com/titles/fr_arr/multiple_models_one_form.pdf en lugar de tomar el índice existente e incrementarlo (era propenso a romperse especialmente si quería extender el anidamiento a otro nivel). – Pasted

+1

Hola pegado, esto es carriles 3.1. Gracias por tus comentarios y enlaces. He intentado implementar su solución usando view_context en lugar de @template y se rompe de la siguiente manera: NameError: variable local indefinida o método 'view_context 'para main: Object – jalagrange

4

En la vista, he encontrado que 'view_context' no funciona en Rails 3.1. En su lugar, intente 'self' al crear un objeto FormBuilder.

s = ActionView :: :: Ayudantes FormBuilder.new (: estudiante, @student, auto, {}, {} proc)

4

para cualquiera que necesite para construir un generador de forma en el controlador, view_context todavía funciona ahí. Usando Rails 4.1.4:

@object = Object.new 
@f = ActionView::Helpers::FormBuilder.new(:object, @object, view_context, {}) 
Cuestiones relacionadas