一。创建模型
1.创建模型及数据表
depot>ruby script/generate model order
depot>ruby script/generate model line_item
2.修改数据表,添加表间关系
修改迁移006_create_orders.rb
class CreateOrders
<
ActiveRecord::Migration
def self.up
create_table :orders do |t|
t.column :name, :string
t.column :address, :text
t.column :email , :string
t.column :pay_type, :string, :limit => 10
end
end
def self.down
drop_table :orders
end
end
def self.up
create_table :orders do |t|
t.column :name, :string
t.column :address, :text
t.column :email , :string
t.column :pay_type, :string, :limit => 10
end
end
def self.down
drop_table :orders
end
end
修改迁移007_create_line_items.rb
class
CreateLineItems
<
ActiveRecord::Migration
def self.up
create_table :line_items do | t |
t.column :product_id, :integer, :null => false
t.column :order_id, :integer, :null => false
t.column :quantity, :integer, :null => false
t.column :total_price, :decimal, :null => false,
:precision => 8 , :scale => 2
end
execute " alter table line_items add constraint
fk_line_item_products foreign key(product_id)
references products(id) "
execute " alter table line_items add constraint
fk_line_item_orders foreign key(order_id)
references orders(id) "
end
def self.down
drop_table :line_items
end
end
def self.up
create_table :line_items do | t |
t.column :product_id, :integer, :null => false
t.column :order_id, :integer, :null => false
t.column :quantity, :integer, :null => false
t.column :total_price, :decimal, :null => false,
:precision => 8 , :scale => 2
end
execute " alter table line_items add constraint
fk_line_item_products foreign key(product_id)
references products(id) "
execute " alter table line_items add constraint
fk_line_item_orders foreign key(order_id)
references orders(id) "
end
def self.down
drop_table :line_items
end
end
depot>rake dg:migrate
3.修改模型添加模型间关系
class
Order
<
ActiveRecord::Base
has_many :line_items
end
has_many :line_items
end
class
Product
<
ActiveRecord::Base
has_many :line_items
end
has_many :line_items
end
class
LineItem
<
ActiveRecord::Base
belongs_to :order
belongs_to :product
end
belongs_to :order
belongs_to :product
end
二。创建表单搜集订单信息
1.在视图添加按钮
app\views\store\_cart.rhtml
<
div
class
="cart-title"
>
Your Cart
</
div
>
< table >
<% = render(:partial => " cart_item " , :collection => cart.items) %>
< tr class ="total-line" >
< td colspan = "2" > Total </ td >
< td class ="total-cell" > <% = number_to_currency(@cart.total_price) %> </ td >
</ tr >
</ table >
<%=button_to "Checkout", :action=>:checkout %>
<% = button_to " Empty cart " , :action => :empty_cart %>
< table >
<% = render(:partial => " cart_item " , :collection => cart.items) %>
< tr class ="total-line" >
< td colspan = "2" > Total </ td >
< td class ="total-cell" > <% = number_to_currency(@cart.total_price) %> </ td >
</ tr >
</ table >
<%=button_to "Checkout", :action=>:checkout %>
<% = button_to " Empty cart " , :action => :empty_cart %>
2.在控制器添加方法
store_controller.rb
def checkout
@cart = find_cart
if @cart.items.empty?
redirect_to_index( " Your cart is empty " )
else
@order = Order.new
end
end
@cart = find_cart
if @cart.items.empty?
redirect_to_index( " Your cart is empty " )
else
@order = Order.new
end
end
3.添加方法的视图
views/store/checkout.rhtml
<
div
class
="depot-form"
>
<% = error_messages_for ' order' %>
< fieldset >
< legend > Please Enter Your Details </ legend >
< % form_for :order, :url => {:action => :save_order} do |form| %>
< p >
< label for ="order_name" > Name: </ label >
<% = form.text_field :name, :size => 40 %>
</ p >
< p >
< label for ="order_address" > Address: </ label >
<% = form.text_area :address, :rows => 3 , :cols => 40 %>
</ p >
< p >
< label for ="order_email" > E-mail: </ label >
<% = form.text_field :email, :size => 40 %>
</ p >
< p >
< label for ="order_pay_type" > Pay with: </ label >
<% =
form.select :pay_type,
Order::PAYMENT_TYPES,
:prompt => " Select a payment method "
%>
</ p >
<% = submit_tag " Place Order " , :class => " submit " %>
<% end %>
</ fieldset >
</ div >
<% = error_messages_for ' order' %>
< fieldset >
< legend > Please Enter Your Details </ legend >
< % form_for :order, :url => {:action => :save_order} do |form| %>
< p >
< label for ="order_name" > Name: </ label >
<% = form.text_field :name, :size => 40 %>
</ p >
< p >
< label for ="order_address" > Address: </ label >
<% = form.text_area :address, :rows => 3 , :cols => 40 %>
</ p >
< p >
< label for ="order_email" > E-mail: </ label >
<% = form.text_field :email, :size => 40 %>
</ p >
< p >
< label for ="order_pay_type" > Pay with: </ label >
<% =
form.select :pay_type,
Order::PAYMENT_TYPES,
:prompt => " Select a payment method "
%>
</ p >
<% = submit_tag " Place Order " , :class => " submit " %>
<% end %>
</ fieldset >
</ div >
4.在模型中添加数据选择项目和数据校验
class Order
<
ActiveRecord::Base
has_many :line_items
PAYMENT_TYPES = [
# Displayed stored in db
[ " Check " , " check " ],
[ " Credit card " , " cc " ],
[ " purchase order " , " po " ]
]
validates_presence_of :name, :address, :email, :pay_type
validates_inclusion_of :pay_type, : in => PAYMENT_TYPES.map{|disp,value|value}
end
has_many :line_items
PAYMENT_TYPES = [
# Displayed stored in db
[ " Check " , " check " ],
[ " Credit card " , " cc " ],
[ " purchase order " , " po " ]
]
validates_presence_of :name, :address, :email, :pay_type
validates_inclusion_of :pay_type, : in => PAYMENT_TYPES.map{|disp,value|value}
end
三。搜集表单信息存储到数据库
1.在视图添加按钮(已添加)
2.在控制器添加方法
store_controller.rb
def save_order
@cart = find_cart
@order = Order.new(params[:order])
@order.add_line_items_from_cart(@cart)
if @order.save
session[:cart] = nil
redirect_to_index( " Thank you for your order " )
else
render :action => :checkout
end
end
@cart = find_cart
@order = Order.new(params[:order])
@order.add_line_items_from_cart(@cart)
if @order.save
session[:cart] = nil
redirect_to_index( " Thank you for your order " )
else
render :action => :checkout
end
end
3.在模型中添加相关方法
class Order
<
ActiveRecord::Base
has_many :line_items
PAYMENT_TYPES = [
# Displayed stored in db
[ " Check " , " check " ],
[ " Credit card " , " cc " ],
[ " purchase order " , " po " ]
]
validates_presence_of :name, :address, :email, :pay_type
validates_inclusion_of :pay_type, : in => PAYMENT_TYPES.map{|disp,value|value}
def add_line_items_from_cart (cart)
cart.items.each do |item|
li = LineItem.from_cart_item(item)
line_items << li
end
end
end
has_many :line_items
PAYMENT_TYPES = [
# Displayed stored in db
[ " Check " , " check " ],
[ " Credit card " , " cc " ],
[ " purchase order " , " po " ]
]
validates_presence_of :name, :address, :email, :pay_type
validates_inclusion_of :pay_type, : in => PAYMENT_TYPES.map{|disp,value|value}
def add_line_items_from_cart (cart)
cart.items.each do |item|
li = LineItem.from_cart_item(item)
line_items << li
end
end
end
代码
class LineItem
<
ActiveRecord::Base
belongs_to :order
belongs_to :product
def self.from_cart_item(cart_item)
li = self.new
li.product = cart_item.product
li.quantity = cart_item.quantity
li.total_price = cart_item.price
li
end
end
belongs_to :order
belongs_to :product
def self.from_cart_item(cart_item)
li = self.new
li.product = cart_item.product
li.quantity = cart_item.quantity
li.total_price = cart_item.price
li
end
end