2010-06-28 2 views
0

«Попытка вызвать частный метод» с депо учебник«Попытка вызвать частный метод» с депо учебник

В моей модели «cart.rb» У меня есть

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 

И в «line_items_controller.rb "у меня есть

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

Когда я выбираю пункт, чтобы добавить его в корзину я получаю„Попытка вызова частного метода“ошибка.

след Приложение

/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' 

Я видел некоторое обсуждение ошибки подобного, и это звучало как ответ был апгрейд на Ruby 1.9 (я использую 1.8.7). Это ответ или есть еще одна возможная причина этого?

ответ

4

предоставить весь код cart.rb, если возможно. Возможно, ваш метод add_product находится под каким-то частным методом. Я знаю, что это должен быть комментарий, я хочу объяснить его примером, поэтому я вставляю его в ответ.

private 
    def self.some_method 
    #some code 
    end 

    def add_product(product_id) 

ваш код от комментария является выглядеть так

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 

добавить свой метод после закрытия класса. положить конец класса после окончания метода, и я ставлю, что он будет работать.

изменение 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

класса Cart : уничтожить конец Защиту add_product (product_id) current_item = line_items.where (: product_id => product_id) .Первый если current_item current_item.quantity + = 1 еще current_item = LineItem.new (: product_id => product_id) line_items << current_item конец current_item конец – Maestro1024

+0

Это некрасиво, но это код модели cart.rb. – Maestro1024

+1

вы добавляете свой метод после закрытия класса. положить конец класса после окончания метода, и я ставлю, что он будет работать. – Salil

Смежные вопросы