Time of Update: 2017-02-27
Rails內建了Log功能,或者更準確的說,Rails暴露了Logger對象,該對象可以在所有的Rails程式中使用。Logger是從ruby中移植過來的一個簡單的Log架構(你可以在ruby的命令列裡鍵入ri Logger來查看標準庫的文檔),對於我們而言,我們只需要知道Logger能針對warnning,info,error或者fatal level來產生Log資訊,然後確定向Log檔案中寫入哪個層級的Log資訊。logger.warn("I don't think that's
Time of Update: 2017-02-27
上篇隨筆裡測試了login_controller,我們使用了很多rails內建的斷言和get,put等方法來進行測試。這次來看看rails在功能測試方面的一些約定。1.HTTP請求的方法(HTTP request method)下面的方法用來類比HTTP請求並得到一個回應(response)get()put()post()delete()head()這五個函數每一個都有同樣的四個參數,以get()為例:get(action, parameters = nil, session = nil,
Time of Update: 2017-02-27
上次測試Modeul的問題還沒有解決,但是下面的還要繼續,這次來測試Controller。1.在test\functional目錄下,rails已經為我們的controller產生了對應的測試檔案,要注意application_controller不會產生測試檔案。我們以控制登入的LoginController為例,開啟login_controller_test.rb,內容如下:require File.dirname(__FILE__) + '/../test_helper'require '
Time of Update: 2017-02-27
前面我們已經完成了一個簡單的購物車,從這篇開始我們看看在rails中怎樣進行測試。在我們建立購物車程式的時候在我們的depot目錄下,就已經有一個test目錄了,這就是為我們進行測試準備的。到目前為止,我們看到裡面的fixtrues和functional,unit目錄中已經有對controller和model對應的測試檔案。我們首先測試一下products這個model。代碼test\unit目錄下的product_test.rb檔案,修改其內容為:require File.dirname(__
Time of Update: 2017-02-27
在上次的內容裡,我們示範了怎樣構建一個簡單的購物車,這次的內容非常簡單,給購物車添加錯誤處理。對於Web系統來說,並發處理是一個無法迴避的問題,我們來模仿一個並發衝突的情景:1.使用者進入購物車頁面,看到共有5種商品。2.管理員在後台維護商品列表,將5種商品中的一種刪除掉。3.客戶選中被刪除掉的商品,添加到購物車。在這種情況下,如果不作任何處理的話將會產生一個異常,而我們要作的,是處理這個異常,給使用者顯示一個商品不存在的錯誤提示。1.首先我們需要修改StoreController的add_to
Time of Update: 2017-02-27
在學習Rails中的並發處理的處理前,我們先簡單瞭解下並發處理的概念。在有多個處理同時訪問同一個資料庫的應用程式中,可能會出現這樣的情況,因為一個處理更新了資料庫中的行,而使得另一個處理中持有的資料變得陳舊了。例如,A和B先後從資料庫中提取了相同的資料,並都做了修改,這時B先將自己的修改更新會資料庫,稍後,A將自己的修改更新回資料庫,這時將會覆蓋B所作的修改,當B再次提取資料庫後,看到的是A修改的結果,而不是自己的。一個解決辦法就是將更新的表或者行進行鎖定,防止其他程式進行更新或者訪問,鎖定可以
Time of Update: 2017-02-27
現在我們知道如何指定條件,現在我們來看看find方法支援的一些其他設定。首先,理解find(:first,…)方法是非常重要的,該方法在同樣的conditions設定下,和find(:all,…)方法產生同樣的sql語句,不同之處僅在於只返回一條記錄。在調用的時候,一種的參數為:first,另一種為:all。find方法執行一個select
Time of Update: 2017-02-27
介紹對包含代碼的字串和block求解,是我最鐘愛的Ruby特性之一。Ruby提供了多種不同類型的求解方式;不過我最常用的是下面這些:eval、instance_eval和class_eval。Module.class_eval使用Module類的class_eval(及其別名module_eval)方法,可以在一個類的定義或者module定義的上下文中對給定字串或block進行求解。我們常常用class_eval來向類的定義中加入方法,或是包含其他的module。klass =
Time of Update: 2017-02-27
今天按照Agile Web Development with Rails 的depot例子,準備根據資料庫表自動產生scaffold,那天在公司把這個例子做了一遍,覺得挺順利,沒想到今天換到家裡的機子後,出現了不少問題.在這裡記錄一下出現的問題及解決辦法.1.建立好資料庫和products表後,執行cmd>ruby script/generate scaffold
Time of Update: 2017-02-27
Ruby也能寫servlet?是的,沒開玩笑,而且挺方便的,因為Ruby的標準庫就內建了一個webrick,webrick本身又有一個serlvet容器,隨時隨地啟動一個web server,實在是很方便。先看個最簡單的例子,輸出hello到瀏覽器:require 'webrick'require 'net/http'include WEBrickclass HelloServlet < HTTPServlet::AbstractServlet def hello(resp) resp[
Time of Update: 2017-02-27
這邊都只是個大概,具體的要自己去看文檔了.1 串連SQLite:require 'sqlite' db = SQLite::Database.new("library.db") db.execute("select title,author from books") do |row| p row end db.close2串連mysql:require 'mysql' m = Mysql.new("localhost",&
Time of Update: 2017-02-27
Ruby有三類變數,一種常量和兩種嚴格意義上的偽變數(pseudo-variables).變數和常量都沒有類型.雖然無類型變數存在一定的缺點,但卻有更多的優點並很好的符合Ruby快速簡便(quick and easy)的哲學精神.在大多數語言裡,變數都必須指定其類型,可更改性(是不是個常數)和範圍;由於類型的不存在,剩下的東西也可由變數名字很快確定(你馬上會看見),在Ruby裡我們不需要變數聲明.由首字母標識符將其分類:$ 全域變數@ 實變數[a-z] 局部變數[A-Z]
Time of Update: 2017-02-27
1 動態evaluate代碼全域的方法eval 編譯並且執行一段包含ruby代碼片斷的字串,這是一個很power的機制,因為它允 許你建造在運行時執行的代碼。看下面的例子:Ruby代碼parameters = {} ARGF.each do |line| name, expr = line.split(/\s*=\s*/, 2) parameters[name] = eval expr end假設輸出是這樣的:引用a = 1b = 2 + 3c =
Time of Update: 2017-02-27
1 發送一條訊息給一個對象當你調用一個方法時,你也就是發送了一條訊息給一個對象,在ruby中我們能夠在運行時決定那個方 法被調用。send 方法就是做這個的,他接受一個symbol為參數.舉個簡單的例子,假設我們要寫一個排序,我們想要使用不同的域作為比較的key。雖然我們這時可以 用block,可是如果使用send的話,我們能有一個更優美的寫法:Java代碼class Person attr_reader :name, :age, :height def initialize(name,
Time of Update: 2017-02-27
你通過在方括弧裡列出元素並用逗號將它們相互隔開來建立一個數組. Ruby的數組可以適應不同的物件類型ruby> ary = [1, 2, "3"][1, 2, "3"]就像前面提到的字串一樣.數組也可以相乘或相加ruby> ary + ["foo", "bar"][1, 2, "3", "foo", "bar"]ruby> ary * 2[
Time of Update: 2017-02-27
這章我們將討論更多的Ruby流程式控制制.case我們用case語句測試有次序的條件.正如我們所見的,這和C,Java的switch相當接近,但更強大.ruby> i=8ruby> case i| when 1, 2..5| print "1..5\n"| when 6..10| print "6..10\n"| end6..10nil2..5表示2到5之間的一個範圍.下面的運算式測試 i 是否在範圍內:(2..5) === icase
Time of Update: 2017-02-27
什麼是一個存取器?我們在前面已經討論過實變數了,但卻未過多的討論.一個對象的實變數屬於它的屬性,也是它與其它來自同一個類的對象的一般區別.讀寫它的屬性是重要的;這樣做需要做一個叫著屬性存取器(attribute accessors)的方法.我們將很快看到我們並不是總要明確地寫出存取器方法,但現在先讓我們瞭解所有的細節.存取器的兩種類型是寫(writer)和讀(reader).ruby> class Fruit| def set_kind(k) # a writer| @kind = k|
Time of Update: 2017-02-28
這篇文章主要介紹了Ruby熱門檔案操作方法,本文講解了建立檔案、讀取檔案、刪除、重新命名檔案、目錄操作等熱門檔案操作方法,需要的朋友可以參考下 一、建立檔案 代碼如下: f=File.new(File.join("C:","Test.txt"), "w+") f.puts("I am Jack") f.puts("Hello
Time of Update: 2017-01-18
總結一下工作中遇到的類擴充:1、類繼承: 當多個類公用很多方法的時候可以將公用方法部分抽取出來,需要的類做相關繼承。例子:複製代碼 代碼如下:class A < ActiveRecord::Base def a p "it was a " endendclass B<Aendclass C<AendB.new.a
Time of Update: 2017-01-19
分為如下幾節: ·基本實現 ·在迭代中引用原來的對象,或者直接改變數組的值而不是返回一個新數組 ·向迭代傳入無限多的參數 ·基本實現