Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > uninitialized constant Cart::Cartitem


Автор: DimanLin 9.12.2008, 02:56
Доброе время суток.

Сталкнулся вот стакой проблемой:

URL ошибки: http://localhost:8080/depot/store/add_to_cart/1

Код

uninitialized constant Cart::Cartitem

RAILS_ROOT: /home/diman/NetBeansProjects/depot
Application Trace | Framework Trace | Full Trace

/home/diman/netbeans-6.5/ruby2/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:492:in `const_missing'
app/models/cart.rb:13:in `add_product'
app/controllers/store_controller.rb:9:in `add_to_cart'



Я попробую размышлять, для своего понимания происходящего, надеюсь разобраться вместе с вами.
Ошибка "uninitialized constant Cart::Cartitem" говорит мне, что есть класс Cart(модель), в котором есть метод Cartitem, с инсалезацией которого возникла проблема. Если посмотреть в app/models/cart.rb, мы увидим строку @items << Cartitem.new(product).
Отсюда следует, что проблема возможна как то связанна с областью видимости внутри модели. т.е мы неможем создать объект Cartitem внутри Cart. 

Звучит как полная глупость. Подскажите где проблема?  smile 


Вот 3 файла, из которых 2 модели и 1 контроллер

app/models/cart.rb
Код

class Cart
  attr_reader :items

  def initialize
    @items = []
  end

  def add_product(product)
    current_item = @items.find {|item| item.product == product}
    if current_item
      current_item.increment_quantity
    else
      @items << Cartitem.new(product)
    end
  end
end



app/models/cart_item.rb
Код

class Cartitem
  attr_reader :product, :quantity

  def initialize(product)
    @product = product
    @quantity = 1
  end

  def increment_quantity
    @quantity += 1
  end

  def title
    @product.title
  end

  def price
    @product.price * quantity
  end
end


app/Controllers/store_controller.rb
Код

class StoreController < ApplicationController
  def index
    @products = Product.find_products_sale
  end

  def add_to_cart
    @cart = find_cart
    product = Product.find(params[:id])
    @cart.add_product(product)
  end

  private
  def find_cart
    session[:cart] ||= Cart.new
  end
end


Автор: fixxer 9.12.2008, 15:37
а если класс через CamelCase обозвать? 

Код

class CartItem
  #...
end


Такое ощущение, что класс не находится, а посему руби считает что (т.к. с большой буквы) это константа в классе Cart, которую тоже не находит и радостно об этом говорит smile

Добавлено через 2 минуты и 17 секунд
Просто насколько я знаю, должно быть соответствие между именем файла и именем класса.

файл: my_damn_long_class_name.rb
класс: MyDamnLongClassName

Автор: DimanLin 10.12.2008, 10:59
Да, вы правы. Заработало!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)