程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Ruby on rails開發從頭來(windows)(十四)-送貨處理

Ruby on rails開發從頭來(windows)(十四)-送貨處理

編輯:關於JAVA

在上次的內容裡,我們完成了訂單的編寫。這次我們模擬一個簡單的送貨頁面,給這個購物車的管理員用。

1.首先,我們修改order表,給他添加一個字段shipped_at:

create table orders (
id int not null auto_increment,
name varchar(100) not null,
email varchar(255) not null,
address text not null,
pay_type char(10) not null,
shipped_at datetime null,
primary key (id)
);

2.添加一個Action,在admin_controller.rb文件中添加一個方法:

def ship
  @pending_orders = Order.pending_shipping
end

3.給order的model實現pending_shipping方法:

def self.pending_shipping
  find(:all, :conditions => "shipped_at is null")
end

4.還是老道路,M有了,C有了,還差個V,現在來補上:

在Views的admin目錄下,創建一個ship.rhtml文件,內容如下:

<h1>Orders To Be Shipped</h1>
<%= form_tag(:action => "ship") %>
<table cellpadding="5" cellspacing="0">
<%= render(:partial => "order_line", :collection => @pending_orders) %>
</table>
<br />
<input type="submit" value=" SHIP CHECKED ITEMS " />
<%= end_form_tag %>
<br>

注意蘭色的一行,參數partial指明了一個局部的模板,collection參數指定了使用的數據的集合,這裡是pending_orders方法取出的order。如果不明白(其實我自己也不明白J),先不著急,等下看看效果圖就好了。

5.下面,我們還要再進行一步,實現上面調用的order_line這個頁面,還是在Views的admin目錄下,創建一個_order_line.rhtml文件,作為約定,文件名使用“_”作為前綴。文件內容如下:

<tr valign="top">
    <td class="olnamebox">
           <div class="olname"><%= h(order_line.name) %></div>
           <div class="oladdress"><%= h(order_line.address) %></div>
    </td>
    <td class="olitembox">
           <% order_line.line_items.each do |li| %>
           <div class="olitem">
                  <span class="olitemqty"><%= li.quantity %></span>
                  <span class="olitemtitle"><%= li.product.title %></span>
           </div>
           <% end %>
    </td>
    <td>
           <%= check_box("to_be_shipped", order_line.id, {}, "yes", "no") %>
    </td>
</tr>

6.看看效果圖:

7.當然,上面的效果還不是很好看,我們要美化下,修改Views的layouts目錄下的admin.rhtml文件:

<html>
    <head>
           <title>ADMINISTER Pragprog Books Online Store</title>
           <%= stylesheet_link_tag "scaffold", "depot", "admin", :media => "all" %>
    </head>
    <body>
    <div id="banner">
           <%= @page_title || "Administer Bookshelf" %>
    </div>
    <div id="columns">
           <div id="side">
                  <%= link_to("Products", :action => "list") %>
                  <%= link_to("Shipping", :action => "ship") %>
           </div>
           <div id="main">
                  <% if @flash[:notice] -%>
                         <div id="notice"><%= @flash[:notice] %></div>
                  <% end -%>
                  <%= @content_for_layout %>
           </div>
    </div>
    </body>
</html>

再來看看效果:

8.接下來我們要實現“SHIP CHECKED ITEMS”按鈕的功能。修改admin_controller.rb文件,添加下面的代碼:

def ship
  count = 0
  if things_to_ship = params[:to_be_shipped]
   count = do_shipping(things_to_ship)
   if count > 0
    count_text = pluralize(count, "order")
    flash.now[:notice] = "#{count_text} marked as shipped"
   end
  end
  @pending_orders = Order.pending_shipping
 end
private
 def do_shipping(things_to_ship)
  count = 0
  things_to_ship.each do |order_id, do_it|
   if do_it == "yes"
    order = Order.find(order_id)
    order.mark_as_shipped
    order.save
    count += 1
   end
  end
  count
 end
 def pluralize(count, noun)
  case count
   when 0: "No #{noun.pluralize}"
   when 1: "One #{noun}"
   else "#{count} #{noun.pluralize}"
  end
 end

再給order.rb文件中添加代碼:

def mark_as_shipped
  self.shipped_at = Time.now
end

這時候選中頁面上的Check框,再點擊按鈕以後,會出現類似下面的效果:

OK,這次就到這裡,目前為止我也僅僅還是從書本上拷貝代碼,有很多細節還不清楚。後面爭取有自己的理解寫出來。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved