2012-08-03 18 views
6

Tengo una página en la que crea una factura. Hay una sección separada que le permite agregar pagos a las facturas. Lo que quiero hacer es agregar la capacidad de crear un pago al crear una factura.Rieles Renderice parte de un formulario dentro de otro formulario

Estoy queriendo ver el formulario "Crear pago" VER en el formulario "Crear factura" VER. ¿Cómo puedo hacer esto? Aquí hay un código:

vista formulario de factura (cuenta de la llamada render):

<%= form_for(@contract) do |f| %> 
    <div class="field"> 
    f.label "Add payment?" 
    <div id="pay_form"> 
     <%= render 'payments/pay_form' %> 
    </div> 
</div> 

(_pay_form.html.erb) El parcial de la forma de crear pago (cuenta de que no estoy incluyendo la etiqueta form_for aquí porque no quiero a una forma próxima dentro de otro formulario en la página de la factura anterior):

<div class="field"> 
    <%= f.label 'Amount Paid:' %> 
    <%= f.text_field :amount %> 
</div> 
<div class="field"> 
    <%= f.label 'Payment Method' %> 
    <%= f.select :method, %w(Cash Credit Check) %> 
</div> 

el principal problema es la variable f en el parcial no existe. E incluso si asigno la var f de la factura desde su formulario, los nombres de los parámetros serían params[:invoice][:amount] en lugar de params[:payment][:amount]. ¿Ves lo que estoy diciendo?

¿Cuál es la mejor manera de hacerlo?

+0

¿verificó [accepts_nested_attributes_for] (http://api.rubyonrails.org/classes /ActiveRecord/NestedAttributes/ClassMethods.html) y [fields_for helper] (http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for)? –

Respuesta

7

Debe pasar la variable f de la vista al parcial.

Para ello, cambie

<%= render 'payments/pay_form' %> 

en

<%= render 'payments/pay_form', f: f %> 

en caso de que se produzcan errores de nombre, ya que ambos llevan el nombre f

intento:

<%= render :partial => 'payments/pay_form', :locals => { :f => f} %> 

o

<%= form_for(@contract) do |builder| %> 
    <div class="field"> 
    builder.label "Add payment?" 
    <div id="pay_form"> 
     <%= render 'payments/pay_form', f: builder %> 
    </div> 
</div> 

Espero que esto ayude.

Para seguir aprendiendo, creo que lo que realmente buscas son formularios anidados.

Éstos son algunos buenos tutoriales sobre este tema, si está interesado en aprender acerca de ellos:

http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2

+0

Gracias por esta respuesta. Debido a la forma en que lo tengo, los pagos no están asociados directamente con los contratos, por lo que originalmente ignoré la idea de accept_nested_attributes_for. Sin embargo, me olvidé por completo de los fields_for helper, que es exactamente lo que necesitaba para poder usar el parcial (que se utilizaba para los vars 'f' del generador de caracteres) sin crear otro formulario dentro del formulario original. ¡Me guiaste por el camino correcto! –

Cuestiones relacionadas