# store_controller.rb
def save_order
@cart = find_cart
@order = Order.new(params[:order])
@order.line_items << @cart.items
if @order.save
@cart.empty!
redirect_to_index('Thank you for your order')
else
render :action => 'checkout'
end
end
line_items 關聯)# order.rb
class Order < ActiveRecord::Base
has_many :line_items
validates_presence_of :name, :email, :address, :pay_type
# ...
end
必填欄位驗證,失敗時 @order.errors 記錄錯誤詳情。
<%= error_messages_for("order") %>
<%= stylesheet_link_tag "scaffold", "depot", :media => "all" %>
error_messages_for 自動產生錯誤摘要清單,樣式可透過 CSS 客製化。
orders、line_items 表各新增一筆記錄# orders 表
id, name, email, address, pay_type, shipped_at
# line_items 表
id, order_id, product_id, quantity, unit_price
@order.line_items << @cart.items 自動設定 order_id 外鍵並建立關聯記錄。
Order.transaction { ... } 確保訂單與明細原子性(Rails save 已內建)save_order 中OrderMailer.deliver_confirmation(@order))OrderLog.create(:order => @order, :action => 'created'))