我正在关注《使用 Rails 进行敏捷 Web 开发 - 实用指南》一书。在迭代 C1 中,创建购物车时出现以下错误:
NoMethodError in StoreController#display_cart undefined method `items' for #<Hash:0xb5cf041c> Extracted source (around line #15): 13 def display_cart 14 @cart = find_cart 15 @items = @cart.items 16 end 17 18 private
源文件如下:
路线.rb
Rails.application.routes.draw do
get 'store' => 'store#index'
get 'add_item_to_cart' => 'store#add_to_cart'
get 'display_cart' => 'store#display_cart'
resources :products
store_controller.rb
class StoreController < ApplicationController
def index
@products = Product.salable_items
end
def add_to_cart
product = Product.find(params[:id])
@cart = find_cart
@cart.add_product(product)
redirect_to display_cart_path
end
def display_cart
@cart = find_cart
@items = @cart.items
end
private
def find_cart
session[:cart] ||= Cart.new
end
end
购物车.rb
class Cart
attr_reader :items
attr_reader :total_price
def initialize
@items = []
@total_price = 0.0
end
def items
@items
end
def add_product(product)
@items << LineItem.for_product(product)
@total_price += product.price
end
end
line_item.rb
class LineItem < ActiveRecord::Base
belongs_to :product
def self.for_product(product)
item = self.new
item.quantity = 1
item.product = product
item.unit_price = product.price
item
end
end
我从 StoreController
的 add_to_cart
操作到达操作 display_cart
。即使我在 cart.rb
中有一个 def items
,为什么我会得到一个 NoMethodError
?
最佳答案
假设您在 session 中存储了购物车 ID,您可以在方法中进行以下更改
def find_cart
Cart.find_by_id(session[:cart_id]) ||= Cart.new
end
关于ruby-on-rails - StoreController 中的 NoMethodError#display_cart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677416/