2011-02-01 23 views
5

¿Alguien puede guiarme por los atributos anidados en Rails 3?Atributos anidados en Rails 3

que tienen dos modelos: Certificados y Custodios, relacionados de la siguiente manera:

modelo de certificado:

class Certificate < ActiveRecord::Base 
    belongs_to :shareholder 
    belongs_to :custodian 
    belongs_to :issuer 

    accepts_nested_attributes_for :custodian, :shareholder, :issuer 
end 

controlador certificado:

class CertificateController < ApplicationController 
    def issue 
    @certificate = Certificate.new 
    @certificate.custodian.build 
    end 
end 

Mi Vista:

<% form_for(:certificate, :url => {:action => 'testing'}) do |f| -%> 

<div id="error"> 
    <%= f.error_messages %> 
</div> 

    <%= f.label :number, "Certificate Number" %> 
    <%= f.text_field :number %> <br/> 

    <%= f.label :num_of_shares, "Number Of Shares" %> 
    <%= f.text_field :num_of_shares %> <br/> 

    <% f.fields_for :custodian do |custodian| -%> 
     <%= custodian.label :name, "Custodian Name" %> 
     <%= custodian.text_field :name %> 
    <% end -%> 

    <%= f.submit "Issue Certificate", :disable_with => 'Working....' %> 

<% end -%> 

Ahora, por alguna razón, en mi controlador en la línea 4: @certificate.custodian.build

estoy recibiendo este error: undefined method 'build' for nil:NilClass

Puede alguien por favor ayuda?

Respuesta

7

accepts_nested_attributes_for debe ir en el lado de la una de la relación de uno a muchos.

class Custodian < ActiveRecord::Base 
    has_many :certificates 
    accepts_nested_attributes_for :certificates 
end 

Por lo tanto, en su opinión, no debería haber fields_for: custodian, está en el lado equivocado. Si tiene que crear un certificado desde esa vista, debe listar los custodios disponibles, probablemente en un cuadro de selección.

+0

Gracias 'Pejic' eso es exactamente lo que estoy tratando de lograr. Pero en lugar de un cuadro de selección, planeo usar Ajax para crear un campo de autocompletar. Pero por ahora, estoy interesado en hacer esto como lo describiste. –

+0

puedo crear una nueva variable de instancia con los Custodios enumerados y mostrar un cuadro de selección, pero ¿cómo puedo volver a guardar la asociación en el modelo? –

+0

Complete el cuadro de selección con pares de opciones de ID/nombre. Aquí hay una buena guía sobre cómo hacerlo, http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease Esto debería tener su forma básica en funcionamiento. Para completar automáticamente, debe compilar el JSON para que pase algo único al controlador Custodians, como un ID o un nombre si el nombre es único. –

9

Con un belongs_to, debe ser

@certificate.build_custodian 
+1

Gracias 'guitsaru' que funcionó. Pero, mi vista no está representando la parte 'fields_for' en absoluto. El resto del formulario se está procesando correctamente. –

6

Esta línea

<% f.fields_for :custodian do |custodian| -%> 

debería ser

<%= f.fields_for :custodian do |custodian| -%> 
Cuestiones relacionadas