【ror学习笔记7】表单

一。创建模型

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

修改迁移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

depot>rake dg:migrate

3.修改模型添加模型间关系

 
  
class Order < ActiveRecord::Base
has_many :line_items

end

 

 
  
class Product < ActiveRecord::Base
has_many :line_items
end

 

 
  
class LineItem < ActiveRecord::Base
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 %>

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

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 >

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

 

三。搜集表单信息存储到数据库

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

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

 

代码
 
   
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

 

转载于:https://www.cnblogs.com/sherlcok/archive/2010/11/22/1884780.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值