我正在阅读一本关于敏捷Web开发的书,我找到了这段代码
应用程序控制器
private
def current_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
订单项控制器
def create
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(:product => product)
respond_to do |format|
if @line_item.save
format.html { redirect_to(@line_item.cart,
:notice => 'Line item was successfully created.') }
我不明白以下两行
@line_item = @cart.line_items.build(:product => product)
format.html { redirect_to(@line_item.cart,
:notice => 'Line item was successfully created.') }
@cart
保存cart_id
的值然后@cart.line_items
点{build}在这里有什么用途?
此处@line_item.cart
的含义是什么?将调用哪个动作?
答案 0 :(得分:1)
好的,让我们从@cart
开始吧。正如phoet所说,它不是一个简单的整数。它由Cart.find(session[:cart_id])
设置,因此它是基于数据库中一行的Cart
模型的实例。
Cart
模型可能继承自ActiveRecord::Base
,它具有模型之间has_many(和其他)关联(关系)的所有逻辑。所以,我希望至少看到
def Cart < ActiveRecord::Base
has_many :line_items
end
在Cart
模型中。
因此,当您致电@cart.line_items
时,您会通过调用has_many
设置的关联从概念上获得该购物车订单项的列表。在build
上调用LineItem
会导致cart_id
模型的@cart.id
模型实例{{1}}设置为{{1}}。
我希望稍微澄清一下。 Rails协会是一项棘手的业务。
答案 1 :(得分:0)
您的假设不正确。 @cart
拥有Cart
方法中的current_cart
个对象。它可以是新的,也可以是会议期间的那个。
因此@cart.line_items
适用于has_many
的{{1}}关系,而Cart
会设置一个新的line_items.build
,以便LineItem
保存到数据库中}。