2010-01-20 3 views
1

J'ai un modèle Customer simple qui a des colonnes id, firstName, lastName, address_id.Méthode non définie self.id in rails modèle

Dans la méthode que j'ai la méthode suivante pour ajouter des données à la base de données:

def self.add_customer(firstname, lastname) 
    @cust = Customer.new(:firstName => firstname, :lastName => lastname, :address_id => self.id) 
    @cust.save 
    end 

Cela me donne erreur de

undefined method `id' 

J'utilise des rails 2.3.5 J'ai vu ce code fonctionne dans de nombreux livres. Ma table Customer possède une colonne ID. J'ai vérifié dans la base de données réelle.

+0

Est-ce que 'Customer' étend' ActiveRecord :: Base'? –

Répondre

6

self.add_customer est la méthode de classe, pas la méthode d'instance, et vous avez la méthode id uniquement dans les instances.

Edit:
Soit supposer que vous avez:

class Customer < ActiveRecord::Base 
    belongs_to :address 
end 

Class Address < ActiveRecord::Base 
    has_many :customers 
end 

Vous pouvez alors:

@address.customers.create(:first_name => first_name, :last_name => last_name) 

et il associera automatiquement nouveau client avec @address.

Sinon, vous pouvez supprimer l'auto de la définition de la méthode et

def add_customer(firstname, lastname) 
    @cust = Customer.new(:firstName => firstname, :lastName => lastname, :address_id => self.id) 
    @cust.save 
end 

devrait fonctionner. Cela fonctionne parce que si vous déclarez add_customer comme méthode d'instance (sans nom d'individu ou de classe comme Address.add_customer) alors il a accès à self.id

+0

alors, y a-t-il un moyen d'accéder à l'identifiant? J'essayais d'imiter ce que j'ai vu dans une autre réponse sur SO: http://stackoverflow.com/questions/1673433/how-to-insert-into-multiple-tables-in-rails/1673442#1673442 – Omnipresent

+0

Merci, mais j'avais essayé ça. Si je supprime self de add_customer alors quand j'appelle cette méthode de mon contrôleur en écrivant Customer.add_customer alors il échoue en disant la méthode non définie add_customer .. – Omnipresent

+0

@omnipresent Pourquoi appelez-vous 'Customer.add_customer' du contrôleur? Vous pouvez facilement appeler 'Customer.create (: first_name => first_name,: last_name => last_name,: address => @address)' et la liste complète des paramètres peut être donnée à partir du formulaire, donc: 'Customer.create (params [: customer ]) 'devrait fonctionner aussi – MBO

Questions connexes