一、ruby和rails簡介
ruby是一種面向對象的動態腳本語言。它的語法很靈活,而且提供了豐富的類庫。因此,用ruby編寫程序的效率是非常高的。
雖然ruby很早就出現了(1993年誕生於日本),但由於ruby一直缺乏英語文檔,而且當時的ruby在web開發上並不怎麼出眾。因此,在2000年之前,ruby還只在日本流行。但這一切被2000年問世的rails打破。
Rails是使用純ruby編寫的框架(framework)。它對web開發提供了強有力的支持,如支持數據映射、MVC模式、Web Services、安全等。而且這些功能操作起來要比同類的產品容易的多,如MVC模式就比struts更容易使用。除了這些,rails還可以根據模板自動生成web程序。這樣可以省去我們很多的時間。在討論ruby如何借助rails快速開發web程序之前,讓我們先看看如何安裝和運行ruby和rails。
安裝和運行ruby
Ruby支持多個操作系統平台,目前支持windows、linux和OS X,可以從ruby的官方網站下載ruby的安裝程序和源代碼:http://www.ruby-lang.org/en/downloads/。
在windows下為了方便安裝,建議下載ruby的安裝版本。在安裝完後,在ruby的安裝目錄中的bin目錄中有兩個可執行文件:ruby.exe和rubyw.exe。第一個將啟動一個控制台運行ruby程序,而第二個不啟動控制台運行ruby程序。讓我們先編寫一個簡單的ruby程序吧!
建一個文本文件:first_ruby.rb
輸入一條ruby語句:
puts Time.now.strftime("%Y-%m-%d %H:%M:%S")
執行ruby first_ruby.rb
如果輸出類似"2006-10-07 19:20:20"的字符串,則說明ruby已經安裝成功。
注:ruby有一個eclipse插件非常不錯,如果對其感性趣,可以使用eclipse的help->Software Updates->Find and Install功能通過http://updatesite.rubypeople.org/release進行安裝。
安裝和運行rails
Rails在windows下安裝是非常容易的,只需要執行如下命令:
gem install rails --include-dependencies即可。
注:gem命令在ruby安裝目前的bin目錄中,運行時要設置path路徑。還有在執行這條命令時本機一定要連接internet。因為這條命令是通過internet來下載rails並安裝的。
在安裝完rails後。執行下列命令
rails first_rails cd first_rails ruby script/server
如果出現如圖1的提示,則說明這些命令執行成功。
圖1 ruby script/server的提示信息
然後在IE中輸入http://localhost:3000。如果出現如圖2的歡迎界面,則說明rails安裝成功。
圖2 rails的歡迎界面
Rails支持很多數據庫,它默認支持的數據庫是MySQL。由於使用MySQL數據庫不需要安裝驅動。因此,本文將使用MySQL數據庫來討論rails如何對數據庫進行操作。
二、使用rails自動生成web程序
Rails最獨特的功能就是可以根據模板自動生成web程序,這樣可以為我們省去很多時間。下面我們就使用rails本身提供的模板來生成一個簡單的web程序。
第一步 初始化
執行如下命令
rails autoweb cd autoweb
第二步 建立數據庫
啟動MySQL服務後。以root用戶登錄後建立三個數據庫
create database autoweb_development create database autoweb_test create database autoweb_production
分別在這三個數據庫中建立同樣的表records。
CREATE TABLE records ( id int(10) unsigned NOT NULL auto_increment, title varchar(50) NOT NULL, content mediumtext NOT NULL, dt datetime NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
第三步 修改database.yml文件
database.yml文件保存著數據庫的連接信息。這個文件在first_rails\config中。其中有三個標簽:development、test和production。從理論上它們應該描述三個不同的數據庫。這三個數據庫的結構應該是完全一樣的。它們分別用在開發、測試和產品發布上。從而使這些工作不互相沖突。
在本例中只需要修改password項即可(將其設置為root的密碼)。
第四步 生成web程序代碼
執行如下命令
ruby script/generate scaffold Record Admin
第五步 啟動服務
執行如下命令
ruby script/server
到現在為止,這個web程序已經生成完畢。它可以對records表進行基本的增、刪、改操作。在IE中輸入http://localhost:3000/admin可對records進行相應的操作。界面如圖3所示。
圖3 autoweb的首頁
點擊"New record"可增加一條新記錄以及進行其它操作。
三、使用活動記錄(Active Record)進行數據映射
在上面給出的例子中也許有一個地方最令人迷惑。就是在上述五步中並未給出要操作的是哪一個表。那麼rails如何得知我們要操作records表呢?這一點就要從rails中的活動記錄說起。
Rails提供了一種非常方便的數據映射機制 - 活動記錄。這種機制可以使用盡可能少的代碼將一個數據表映射成ruby對象。為了達到這一目的,rails給出了一些約定。如上面的例子的第四步中使用了Record作為映射數據表的類名,而如果不明確指定所映射的表名時,rails就將這個類名後加s作為表名,即records。下面的代碼是一個關於活動記錄的例子。
require 'rubygems' require_gem 'activerecord' class Record < ActiveRecord::Base # set_table_name('tablename') establish_connection( :adapter => "mysql", :host => "localhost", :username => "root", :password => "password", :database => "autoweb_development" ) end record = Record.new record.title = 'abc' record.content = 'aabbcc' record.dt = Time.now if record.save puts '增加記錄成功!' else puts '增加記錄失敗!' end
運行它 ruby map.rb
上面的代碼有4點需要注意一下
1. 活動記錄必須從ActiveRecord::Base繼承。
2. 除了使用databvase.yml設置數據庫連接信息外,還可以通過establish_connection將數據庫連接信息寫在程序中。
3. 使用活動記錄映射數據表一般並不需要將表中的每個字段定義在類中,默認情況下這字段名就是類的屬性名。
4. 如果不想使用約定來確定表名,可以通過set_table_name指定其它的表名。
四、使用ruby on rails實現一個在線日記程序
為了更好地理解如何利用rails來開發web應用程序,在這一節中我們使用rails手工編寫一個在線日記程序。這個程序以一天為單位記錄信息。即每一天是一條記錄。下面就詳細描述這個程序的設計過程:
第一步 初始化
rails diary cd diary
第二步 建立數據庫
create database diary; create table records ( `id` int(10) unsigned NOT NULL auto_increment, `title` varchar(50) NOT NULL, `content` mediumtext NOT NULL, `date` char(10) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `Index_2` (`date`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
第三步 編寫數據表映射類
在app\models中建立record.rb文件,在其中輸入如下代碼:
class Record < ActiveRecord::Base establish_connection( :adapter => "mysql", :host => "localhost", :username => "root", :encoding => "gb2312", :password => "password", :database => "diary" ) end
注: :encoding => "gb2312" 是必須的,如果沒有,漢字就無法保存在數據庫中了。
第四步 編寫控制類
在app\controllers中建立diary_controller.rb文件,在其中輸入如下代碼。
class DiaryController < ApplicationController before_filter :configure_charsets def configure_charsets @response.headers["Content-Type"] = "text/html; charset=gb2312" end def index end def write # 查找當天的記錄,看看今天是否已經有日記了 @record = Record.find_by_date(Time.now.strftime("%Y-%m-%d")) if @record == nil # 如果沒有,增加一條記錄 @record = Record.new end end def create @record = Record.find_by_date(Time.now.strftime("%Y-%m-%d")) if @record == nil @record = Record.new @record.date = Time.now.strftime("%Y-%m-%d") end # 保存數據 if @record.update_attributes(params[:record]) @saved = true else @saved = false end end def query end def result # 得到提供的日期 @year [email protected]["record[date(1i)]"].to_s; @month = sprintf("%02d", @request.params["record[date(2i)]"].to_s) @day = sprintf("%02d", @request.params["record[date(3i)]"].to_s) @query_date = @year + "-" + @month + "-" + @day @record = Record.find_by_date(@query_date) end end
以上代碼有4點需要說明一下:
1. 控制類必須從ApplicationController繼承。
2. 控制類中每一個方法都可作為一個path,如write方法可以在IE中輸入http://localhost:3000/diary/write。然後rails先執行這個方法,再調用下面將要講的rhtml文件。
3. configure_charsets方法是必須的。這個方法在向IE輸出html代碼之前調用。而其中的代碼@response.headers["Content-Type"] = "text/html; charset=gb2312"設置了html所支持的編碼類型。如果沒有這條語句。必須得手工調整IE的編碼設置才能正常顯示漢字。
4. index方法是默認路徑。如果直接輸入http://localhost:3000/diary,則執行index方法。
第五步 編寫rhtml文件
也許你看到這個標題會感到奇怪,是不是寫錯了,是html吧?我可以肯定地告訴大家,就是rhtml文件。這個文件類型是rails定義的。它類似於jsp或aspx文件。是在後台執行的。在其中定義了很多類似於jsp的tag的東西。由於rhtml文件很多,在這裡只給出write.rhtml的例子。
<h3>日記</h3>
<%= start_form_tag :action => 'create' %>
<%= render :partial => 'form' %>
<%= submit_tag "保存" %>
<%= end_form_tag %>
其中submit_tab就是一個tag。Rails將submit_tag翻譯成html代碼傳給IE或其它浏覽器。其它的rhtml文件請參閱本文提供的源代碼。這些文件都被建立在app\views\diary中。
注:每一個作為path的方法必須對應一個rhtml文件,否則會報錯。
第六步 啟動服務
ruby script/server
在IE中輸入http://localhost:3000/diary可看到如圖4所示的界面。
圖4:日記程序主界面
通過點擊“寫日記”和“查詢日記”鏈接,可以進行相應的操作。
五、小結
通過上節的介紹,我們已經了解了使用rails開發web程序的基本過程。使用rails開發web程序自動遵循MVC模式。分別將M、V、C所定義的代碼放到了app\models、app\views和app\controllers三個目錄中。然後rails會自動處理。這一點要比struts的一大堆設置方便得多。
當然,rails的功能還遠遠不止這些。Rails最強大的功能就是活動記錄。使用它可以很方便地映射數據表,而且還可以描述表之間的相互關系,以及其它一些有價值功能。除了這些外,rails還支持web services、actions mailer、security等。總之,如果能夠靈活使用rails,就可以通過ruby快速開發出強大的web應用程序。
本文配套源碼