我正在创建一个允许用户从在线商店购买商品的应用。我按照RailsCasts剧集,并像我这样构建我的OrdersController
。
def create
@order = current_cart.build_order(order_params)
@order.ip_address = request.remote_ip
if @order.save
if @order.purchase
Item.where(email: Order.last.email).last.purchased == true
PurchaseMailer.confirmation_email(Item.last.email).deliver
flash[:notice] = "Thanks for your purchase"
redirect_to root_path
else
flash[:danger] = "Something was wrong"
redirect_to :back
end
else
render :action => 'new'
end
end
我最近决定在我的商品中添加一个属性,说明他们是否已购买。购物车中的商品尚未购买。我创建了一个迁移,为所有项目提供了一个已购买的属性,即boolean
。
默认情况下,不购买商品,因此默认值为false。
class AddPurchasedToItem < ActiveRecord::Migration
def change
add_column :items, :purchased, :boolean, :default => false
end
end
这就是为什么我将这行代码添加到我的Orders#Create
操作中。
Item.where(email: Order.last.email).last.purchased == true
这里我将购买的值从false设置为true。但是,当我加载rails console
时Item.last.purchased
=> false
看起来价值仍然没有被存储
答案 0 :(得分:0)
正如另一个回应所指出的那样,你正在使用==
来分配一个不正确的值。您需要=
代替。
您必须在为其指定值后保存项目。
一个例子:
conditions = {email: Order.last.email} # using your conditions
item = Item.find_by(conditions)
item.purchased = true
item.save # this is what you're missing
Item.find(item.id).purchased # will be true
另一种更新方式如下:
item.update_attribute(:purchased, true)
另一种方法是在ActiveRecord :: Relation对象上调用update_all
,如下所示:
# update all items that match conditions:
Item.where(conditions).update_all(purchased: true)
您选择的方法可能取决于方案,因为update_all
未运行您在模型中指定的回调。
但是,在您的情况下,您所缺少的只是item.save
行。
答案 1 :(得分:0)
Item.where(email: Order.last.email).last.purchased == true
您正在使用==
运算符尝试分配值。请尝试使用=
。