[rails] 我的訂餐系統 -- 小試ruby on rails

  • 前言
            近期在java社區中一種新的腳本語言ruby,及用ruby開發的一個wab框架 rails也熱鬧了起來.引起了不少的java開發人員的關注.
      本人平時還是很少接觸腳本語言方面東東,看到相關的評論
    例如:  "習慣約定優於配置" -- 那樣就用象java那樣麻煩且繁雜地配置N多XML
               "'一站式'面向用戶的簡單易用的框架"    
               "Ruby 語言- 真正的面向對象腳本語言"
               "Ruby 語法更簡單,靈活" 
       "聲稱:Rails 的開發效率是 java 開發的 10 倍"
    等等,再得到老大的強烈推薦,不禁也開始接觸了一下.
          
    聲明:本人接觸三天,看過一些簡單的介紹以及一些文檔,實操過一個小項目,並未深入瞭解,這一文章並非語言及框架使用教程,只是一個感性認識,其中代碼或許並非最簡潔,如要更深入學習ruby,rails,請參考相關的官方站點以及其語法參數書.
  • Ruby 與 Rails
    [什麼是RUBY ?] 
            Ruby 是由日本人松本行弘發明的一種面向對象的腳本語言.
    聲稱,更快,更通俗易懂的面向對象的語言,本人接觸這段時間,感覺到關於面向對象的確做得不錯.
    一些特點:
    1、一切都是對象,例如:
            數據類型轉換提供如 to_ary,to_i,to_s 等方法,
            
    @i = "2".to_i    //字符串轉數值類型
    puts @i
    +1

            不再象java中的諸如:
             Integer.parseInt()
            String.valueOf()
            那樣難看與及難以理解
            Time.now.strftime(fmt) Time.now對象通過strftime格式化日期類型
      再如koalant在它那本ruby on rails實踐中說到   -166.abs 可以直接取其-166絕對值
             ………………
    2、代碼塊非強制用{} ,無需 ;  作分行標識;
    3、語法靈活,一種可以功能可多種實現,隨個人愛好;
    4、語法簡潔等,做一個應用只要用到幾行代碼,這也是腳本語言的優勢所在
            
            更詳細可參考 http://www.ruby-lang.org/ 以及下面提供的些文檔資料.
           
    [什麼是Rails ?]
            RAILS是用RUBY開發的一個web框架.
            實現一站式開發.        http://www.rubyonrails.org/ 有比較詳細的介紹.
    Rails is a full-stack, open-source web framework in Ruby for writing real-world applications with joy and less code than most frameworks spend doing XML sit-ups
            聲稱用更少的代碼實現web applications。
            此框架主要包括三部分
            Active Record  一個ORM實現
            Action Pack      View 以及controller
            Action Mailer    應該是關於mail方面的東西


    [一些資料]
    [1] koalant寫的Ruby on Rails實踐  ,通俗易懂,介紹了ruby on onrails中的一些基礎的東東
    [2] IBM中文文章: Ruby on Rails 和 J2EE:兩者能否共存?
    [3] Agile Web Development with Rails(以一個案例詳細介紹了ruby on rails)
     下載請見:
    http://www.itpub.net/398528.html
    [4] Ajax on Rails http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html 
    [5] Programming Ruby http://www.rubycentral.com/book/index.html
  • 快速安裝
    1、下載
           到目前爲止最新版本是Ruby 1.8.2,可以到http://rubyforge.org/frs/?group_id=167&release_id=2049
            下載 One-Click Installer - for Windows
    2、點擊下載exe文件一直NEXT 安裝就OK [ 說明:本人安裝在C:/ruby/目錄]
    3、使用 rubygems 來安裝 rails
          CMD進行命令行窗口,通過網絡進行遠程安裝 rails
    C:/> gem install rails --include-dependencies
    //
     Attempting local installation of 'rails'
    Local gem file not found: rails*.gem
    Attempting remote installation of 'rails'
    Updating Gem source index for: http://gems.rubyforge.org
    ………………
    ………………//一連串安裝信息

    C:/> rails C:
    /myrails         //建立web app 目錄
          create
          create  app/apis
          create  app/controllers
          create  app/helpers
          create  app/models
          create  app/views/layouts
          create  config/environments
          create  components
          create  db
          create  doc
          create  lib
          create  log

          說明如果發現gem,rails命令等用不了,可能是環境變量未設置好,
          可自行設置指向你的 安裝目錄/bin
          
      4、運行服務器
            
    C:/> ruby c:/myrails/script/server
    => Rails application started on http://0.0.0.0:3000
    => Ctrl-C to shutdown server; call with --help for options
    [2005-08-11 20:29:56] INFO  WEBrick 1.3.1
    [2005-08-11 20:29:56] INFO  ruby 1.8.2 (2004-12-25) [i386-mswin32]
    [2005-08-11 20:29:56] INFO  WEBrick::HTTPServer#start: pid=4072 port=3000
    127.0.0.1 - - [11/Aug/2005:20:30:08 China Standard Time] "GET / HTTP/1.1" 200 32
    34
    - -> /
    127.0.0.1 - - [11/Aug/2005:20:30:09 China Standard Time] "GET / HTTP/1.1" 304 0
    - -> /
    127.0.0.1 - - [11/Aug/2005:20:30:24 China Standard Time] "GET / HTTP/1.1" 304 0
    - -> /

    http://127.0.0.1:3000 
    恭喜你,如果看到
    Congratulations, you've put Ruby on Rails!頁面
    則表示安裝成功!!!!

    5、 學習一個Ruby的語法
         ruby  以rb爲後綴的文件. 
    hello.rb
    @a = "hello world!"
    puts @a

    C:/ruby/bin>ruby hello.rb
    hello world!
    其它可參考語言書學習.
  • 我的訂餐系統

    1、功能,包括四類基本管理,主要是新增,修改,查看,刪除(CURD) 四種操作
          餐廳管理(shop)
          菜式管理(good)
      人員管理(human)
          訂單管理(order)
      
    2、首頁效果截圖

                由於本人偷懶,樣式借用了jsp wiki的,在此聲明一下: )
[主界面,使用frame,左邊爲主要功能菜單,右邊爲進行CURD操作提供界面操作]

orderList[1].gif

[頁面結構如下所示]
orderList[2].gif

  • 員工管理
    1、快速開發,自動生成基本文件結構目錄及文件
          執行命令,自動生成項目所需要的文件及其文件結構,幾秒種架設好訂餐系統框架!!!
          
    C:/myrails>rails c:/myMealOrder

         說明:rails 一直貫穿的思想說是"習慣約定優於配置",所以,文件結構都是它定義的,我們只要將相應
                 文件放到其定義好的目錄下就行了。
                  例如:controller 應該放到其 webapp/app/controllers 下,本文目錄爲[C:/myMealOrder/app/controllers]
                              model 應該放到其      webapp/app/model下,本文目錄爲[C:/myMealOrder/app/model]
                              views 應該放到其      webapp/app/view下,本文目錄爲[C:/myMealOrder/app/views]
            另外,根本目錄爲webapp/public/ 你可以通過修改index.html來定義你自己的index頁面
    
          2、啓動webrick 服務器測試
                rails默認使用webrick服務器,官方網站了解其更多www.webrick.org
               執行命令
               

C:/>ruby c:/myMealOrder/script/server 


              打開IE 瀏覽 :http://127.0.0.1:3000
             看到Congratulations, you've put Ruby on Rails!表示配置成功
  
3、建立數據庫以及進行配置
    CREATE TABLE humen (
    id int(11) NOT NULL auto_increment,
    code varchar(100) NOT NULL default '',
    mame varchar(100) NOT NULL default '',
    PRIMARY KEY  (`id`)
  )      
    說明,習慣約定,默認情況下主鍵名爲id,表名爲複數形式,具體操作我也有點糊塗,
    例如本例子中的human model對應其數據表名爲humen。這裏我就略過了。具體資料可參考更詳細的資料。
    配置,打開 C:/myMealOrder/config/database.yml
    將其中參數設置正常就行了。
    例如將 database: rails_development 設成你的數據名等

  4、生成human 的 model,controller文件
  

 ruby c:/myMealOrder/script/generate controller human
      exists  app
/controllers/
      exists  app
/helpers/
      create  app
/views/human
      exists  test
/functional/
      create  app
/controllers/human_controller.rb
      create  test
/functional/human_controller_test.rb
      create  app
/helpers/human_helper.rb

 ruby c:/myMealOrder/script/generate model human
      exists  app
/models/
      exists  test
/unit/
      exists  test
/fixtures/
      create  app
/models/human.rb
      create  test
/unit/human_test.rb
      create  test
/fixtures/humen.yml


     
     4、快速實現CURD
    打開app/controllers/human_controller.rb文件,修改爲

   class HumanController < ApplicationController
          scaffold :human
  end


  說明: 簡單的一句 "scaffold :human" 就能對應生成human 的CURD操作及其頁面。
  重啓服務,再次瀏覽   http://127.0.0.1:3000/human
   action包括:
   list(列表,列出所有human),new(新建human),show(顯示human),update(更新human),Destroy(物理刪除human),界面如下圖
list.gifnew.gifedithuman.gif
   我們可以注意其URL
   http://127.0.0.1:3000/human/new
   http://127.0.0.1:3000/human/show/1
   http://127.0.0.1:3000/human/edit/1
   http://127.0.0.1:3000/human/destroy/2
   rails也是MVC的模式,
   1、瀏覽器發出請求;
   2、後臺尋找(new/show/edit/destroy/etc) controller,調用相對應的方法,及view模板;
   3、將結果返回給瀏覽者
   或許你會認爲,這一默認的view大多數情況下並不適合,或許需要自己設計view模板,也行,rails提供快捷的方法
   方便用戶自己設計view模板,只要定義action並將同名view文件(rhtml後綴的文件)放到其webapp/app/views/目錄即可,
   下面將會介紹到相關的操作。
   

  • 餐廳及其菜式管理
    餐廳(shop),菜色(good)按員工管理操作方法進行新建,在這裏就略過了!!
    http://127.0.0.1:3000/shop
    http://127.0.0.1:3000/good

    1、自己設計view 模板
          例如在餐廳列表中我要實現自己的樣式,如下圖:
    shoplist.gif
         具體操作, 新增加 myMealOrder/app/views/shop/list.rhtml (rails中以.rhtml爲view模板文件)
      
    <table border="1" width="500px">
    <tr>
    <td width="20%"><p align="center"><i><b>code</b></i></td>
    <td width="20%"><p align="center"><i><b>餐廳名</b></i></td>
    <td width="20%"><p align="center"><i><b>電話</b></i></td>
    <td width="20%"><p align="center"><i><b>備註</b></i></td>
    <td width="10%"><p align="center"><i><b>編輯</b></i></td>
    <td width="10%"><p align="center"><i><b>刪除</b></i></td>
    </tr>
    <% @shops.each do |shop| %>                  //ruby 語法,循環所有shop
    <tr>
    <td><%= shop.code %></td>
    <td><%= link_to shop.name, :action => "show", :id => shop.id %></td>
    <td><%= shop.phone %></td>
    <td><%= shop.remark %></td>
    <td><%= link_to "編輯", :action => "edit", :id => shop.id %></td>
    <td><%= link_to "刪除", :action => "destroy", :id => shop.id ,:confirm => "Are you sure?" %></td>
    </tr>
    <% end %>
    </table>

    [1]
    <%
     @shops.each do |shop| %>                 
           //ruby 語法,循環所有shop
    <% end %>

    [2] <%= link_to shop.name, :action => "show", :id => shop.id %>
    生成<a>標籤

    修改shop_controller.rb
        def list
            @shops 
    = Shop.find_all
        end

    http://127.0.0.1/shop/list 即可發現我們定義的view生效了 :)
    2、進行兩表關聯
          good 與 shop 關係爲多對一的關聯
          [1] 要實現在編輯good時可設置其所性shop,先爲good表shop_id字段,關聯shop表

          [2] 修改model文件,具體語法可參見相關的參考書本.這裏就略過了
    class Good < ActiveRecord::Base
      belongs_to :shop
    end

    class Shop < ActiveRecord::Base
        has_many :goods
    end
    [3] 編輯controller 
      def edit
            @good 
    = Good.find(@params["id"])
            @shops 
    = Shop.find_all
        end
    [4] 爲good 增加view.rhtml

    <select name="good[shop_id]">
    <% @shops.each do |shop| %>
    <option value="<%= shop.id %>"
    <%= ' selected' if shop.id == @good.shop.id %>>
    <%= shop.name %>
    </option>
    <% end %>
    </select>

    3、正確命名,自動綁定到objcet中
    在java 我們要實現form中的控件提交後自動綁定到object要借用到beanUtil並自己作N多擴展.
    rails中提供了快捷的方法,自要你按要求定義好控件名就能幫自己綁定.
    例如上面的 good[shop_id] 或  good[id] ,good[name] 等等
  • 訂單管理
    1、order及item關聯操作
                    @orderItem = OrderItem.new()
                    @human 
    = Human.find(@value)
                    @good_no_param 
    = "good_" + @value
                    @good 
    = Good.find(params[@good_no_param])
                    @orderItem.human 
    = @human
                       //爲item綁定正確的員工及其訂的盒飯
                    @orderItem.good 
    = @good
                    @orderItem.order 
    = @order
                    @orderItems 
    << @orderItem
                       //爲order綁定新的item
                       @order.orderItems = @orderItems
                       @order.save  //保存

    說明一下,這樣操作,修改order 時原item值並沒刪除或正確的修改,只是將item 的order_id設爲0
    另外再增加相應的item.關於這方面的正確用法還有待研究:)
  • 其它代碼簡單介紹
     1、日期操作

            @date = @params["date"]
            fmt 
    = "%Y-%m-%d"
            
    if @date
            
    else
                @date 
    = Time.now.strftime(fmt)
            end

     2、 find一個對象
        
    Order.find(params[:id])

     3、條件查詢
        @shopId = @params["shopId"]
            @goods 
    = Good.find(:all,
                                                 :conditions 
    => "shop_id = "+@shopId,
                                                 :order 
    => "code desc")

        
     3、 跳轉頁面
        
    redirect_to(:action => 'edit')


     4、session應用
       
    session[:good] ||= Good.find(params[:id]) 
  • 問題
    記錄下在開發過程中遇到的問題
    1、沒相應的工具支持,操作起來還是比較麻煩的,雖然代碼量很少
    2、並不是很健壯,發現挺容易出錯,而且出錯信息也不全
    3、性能還有待增強,(筆者一邊聽歌一邊開發,發現在運行程序時,不時會影響我的wmplayer播放)
  • 思考與總結
    本文並非建議大家使用ruby on rails,因爲在應用過程中畢竟發現不少的問題.
    然而我們能學習些什麼呢??
    [1] 工具支持 
    [2] 習慣優於配置
    [3] 一站式的開發
    [4] 更少的代碼
    我想在那麼大的java 開源社區中實現一站式的開發還是不現實的.
    筆者在想是否能有一個開源項目或者是落實到一個公司的技術框架中能實現到這幾點,那樣就可以從繁雜的配置以及少了爲找N多個開源包或版本的問題而煩惱,而能專心於需求的確認及相關的業務邏輯的改進等等  : )   (完)
 
發佈了37 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章