我正在使用Agile Web Development with Rails(第4版)一书,我碰到了一段无效的代码。我努力弄清楚它为什么不起作用,但我没有成功。
背景信息
涉及以下课程:
class Cart < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
end
class LineItem < ActiveRecord::Base
belongs_to :product
belongs_to :cart
end
class ApplicationController < ActionController::Base
protect_from_forgery
private
def current_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
end
end
现在 这是它失败的地方:
class LineItemsController < ApplicationController
def index
@line_items = LineItem.all`
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @line_items }
end
end
# GET /line_items/1
# GET /line_items/1.xml
def show
@line_item = LineItem.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @line_item }
end
end
# GET /line_items/new
# GET /line_items/new.xml
def new
@line_item = LineItem.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @line_item }
end
end
# GET /line_items/1/edit
def edit
@line_item = LineItem.find(params[:id])
end
# POST /line_items
# POST /line_items.xml
def create
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = **@cart.line_items.build(:product => product)**`
错误消息 * LineItemsController中的NoMethodError #create 用于9的未定义方法`line_items':Fixnum Rails.root:/ home / tmiskiew / depot *
* app / controllers / line_items_controller.rb:53:在'create'中 请求 参数: { “PRODUCT_ID”=&gt; “中4”, “authenticity_token”=&gt; “中dR4nL5zI + R7qIIPwNkl3EoaI1KyFWRokvh92m3PwD8o =”} *
任何人都知道@ cart.line_items.build有什么问题吗? 我正在使用rails 3.0.9和ruby 1.8.7
由于 托马斯
答案 0 :(得分:2)
看看你的错误
undefined method line_items' for 9:Fixnum
这表示@cart是一个数字,而不是Cart对象(来自create action的@cart = current_cart
返回一个数字),
current_cart
函数返回一个数字,因为
Cart.find(session [:cart_id])返回recordNotFound
,并且将执行rescue
函数中的current_cart
块。
请记住,Ruby中的每个函数都会返回上一个执行行的结果,因此您将返回cart.id
编辑:首先评论,尝试重写方法
def current_cart Cart.find(session[:cart_id]) rescue ActiveRecord::RecordNotFound cart = Cart.create session[:cart_id] = cart.id cart # this will get returned end end
答案 1 :(得分:2)
以下是我修复它的方法......希望它也适合你。
<强> /app/models/cart.rb:强>
def add_product(product_id)
current_item = line_items.find_by_product_id(product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(:product_id => product_id)
end
return current_item
end
添加返回。我不是100%确定为什么会失败,但我认为函数只返回数量,而不是订单项,除非if
语句的计算结果为真。
答案 2 :(得分:0)
我有类似的错误,但事实证明我在Cart.rb中有一个拼写错误:
class Cart < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
end
输入错误信息......它会导致未定义的方法...希望这有帮助。
答案 3 :(得分:0)
我遇到了同样的问题,我感到非常困惑。 我通过回滚数据库并再次迁移它来修复它。
终端上的命令: