2010-06-28 8 views
0

« Tentative d'appeler la méthode privée » avec tutoriel dépôt« Tentative d'appeler la méthode privée » avec tutoriel dépôt

Dans mon modèle « cart.rb » Je

def add_product(product_id) 
    current_item = line_items.where(:product_id => product_id).first 
    if current_item 
    current_item.quantity += 1 
    else 
    current_item = LineItem.new(:product_id=>product_id) 
    line_items << current_item 
    end 
    current_item 
end 

Et dans « line_items_controller.rb «Je

def create 
    @cart = find_or_create_cart 
    product = Product.find(params[:product_id]) 
    @line_item = @cart.add_product(product.id) 
    ..... 

Lorsque je sélectionne un élément à ajouter au panier, je reçois une « erreur Tentative d'appel de méthode privée ».

trace d'application est

/Users/machinename/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/attribute_methods.rb:236:in `method_missing' 
/Users/machinename/Documents/rails_projects/depot/app/controllers/line_items_controller.rb:46:in `create' 

j'ai vu une discussion d'une erreur semblable et ça sonnait comme la réponse a été mise à niveau vers Ruby 1.9 (je me sers 1.8.7). Est-ce la réponse ou y a-t-il une autre cause possible?

Répondre

4

donnez tout le code de cart.rb si possible.peut être votre méthode add_product est sous une méthode privée comme. Je sais que cela devrait être un commentaire que je veux expliquer avec un exemple, donc je le colle dans la réponse.

private 
    def self.some_method 
    #some code 
    end 

    def add_product(product_id) 

votre code du commentaire est ressembler à la suite

class Cart < ActiveRecord::Base 
    has_many :line_items, :dependent => :destroy 
end #this end is creating problem 

    def add_product(product_id) 
    current_item = line_items.where(:product_id => product_id).first 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = LineItem.new(:product_id=>product_id) 
     line_items << current_item 
    end 
    current_item 
    end 

vous ajoutez votre méthode après la fermeture de la classe. mettre fin à la classe après la fin de la méthode et je parie que ça va marcher.

changement cart.rb à

class Cart < ActiveRecord::Base 
    has_many :line_items, :dependent => :destroy 


    def add_product(product_id) 
    current_item = line_items.where(:product_id => product_id).first 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = LineItem.new(:product_id=>product_id) 
     line_items << current_item 
    end 
    current_item 
    end 

end #this end should after the end of class method 
+0

classe panier : détruire fin def add_product (product_id) current_item = line_items.where (: product_id => product_id) .first si current_item current_item.quantity + = 1 autre current_item = LineItem.new (: product_id => product_id) line_items << current_item fin current_item fin – Maestro1024

+0

C'est moche mais c'est le code du modèle cart.rb. – Maestro1024

+1

vous ajoutez votre méthode après avoir fermé la classe. mettre fin à la classe après la fin de la méthode et je parie que ça va marcher. – Salil

Questions connexes