天天看點

7.1.3. Interactive Consoles

7.1.3. Interactive Consoles

7.1.3.1. Using Irb

在rails開發工具中最重要的莫過于互動式指令行了,或者是控制台。使用ruby的标準互動式ruby庫(Irb),在控制台中通過指令行你可以通路應用中的每一個部分。你可以加載ActiveRecord對象,檢查和編輯資料,往資料庫中儲存更改的資料。你可以送出控制器請求,并且檢查其結果,不單是對HTML響應,而且包括模闆配置設定,session狀态,flash等等内容。

如果你是Irb新手,現在趕快來上手試試吧!在指令提示符下輸入irb,運作之後,會出現:

irb(main):001:0>

現在輸入任意的ruby代碼(例如,123+456),按一下回車,Irb會輸出結果:

irb(main):001:0> 123 + 456

  579

在Ruby中,要記得,所有一切甚至是整數都是對象,都有方法。每一個對象都有一個叫做class的方法,調用這個方法就會得到對象所屬的類型:

irb(main):002:0> 123.class

  Fixnum

另一個普遍适用的方法是methods,調用這個方法會傳回定義在此對象上可用的方法數組:

irb(main):003:0> 123.methods

=> ["method", "%", "between?", "send", "<<", "prec", "modulo", "&",    

"object_id", ">>", "zero?", "size", "singleton_methods", "__send_    _",    

"equal?", "taint", "id2name", "*", "next", "frozen?",    

"instance_variable_get", "+", "kind_of?", "step", "to_a",    

"instance_eval", "-", "remainder", "prec_i", "nonzero?", "/", "type",    

"protected_methods", "extend", "floor", "to_sym", "|", "eql?",    

"display", "quo", "instance_variable_set", "~", "hash", "is_a?",    

"downto", "to_s", "prec_f", "abs", "singleton_method_added", "class",    

"tainted?", "coerce", "private_methods", "^", "ceil", "untaint", "+@",    

"upto", "-@", "div", "id", "**", "times", "to_i", "<", "inspect",    

"<=>", "==", ">", "===", "succ", "clone", "public_methods", "round",    

">=", "respond_to?", "<=", "freeze", "divmod", "chr", "to_f", "__id_    _",    

"integer?", "=~", "methods", "nil?", "dup", "to_int",    

"instance_variables", "[]", "instance_of?", "truncate"]

這些例子中是怎麼回事?數字(像123這樣的整數)一般都不會被認為是對象,但是在ruby中,他們就是對象。這是一個内省的例子:Ruby能夠檢視對象本身的内容(例如,詢問一個對象的類型或者對象支援什麼方法)。看一下這個方法數組,你可能注意到有一個方法叫做next,并且想知道它的作用,可以嘗試一下:

irb(main):004:0> 123.next

  124

結果很簡單:就是在本身的基礎上加了一。自省對于探索和學習Ruby和Rails對象是一個很有價值的工具。隻要檢視一下對象所支援的方法,嘗試一下,你就會學習到更多的内容。

7.1.3.2. Using the Rails console with ActiveRecord

現在退出Irb(輸入quit指令),切換到Rails控制台,其實rails控制台就是一個經過包裝的Irb,自動将你所開發應用的整個環境裝入其中。可以使用控制台在應用程式的不同層面進行操作,可以直接操作域對象(譬如,ActiveRecord對象,或者模型),或者向控制器送出請求。為了認識一下它是如何在model層面工作,現在假設你有一個簡單的資料庫結構,由users和articles兩張表組成,他們的關系是一對多。對應的模型中定義了他們的關系和資料驗證:

class Article < ActiveRecord::Base

    belongs_to :user

    validates_presence_of :title

end

class User < ActiveRecord::Base

    has_many :articles

    validates_presence_of :name

在model中聲明了這樣的模型關系,Rails控制台提供了豐富的環境與域模型進行互動。輸入script/console,

$ script/console

Loading development environment.

>> a = Article.new

=> #<Article:0x22409e8 @attributes={"user"=>nil, "title"=>nil,    

"body"=>nil}, @new_record=true>

>> a.name = "Using script/console"

=> "Using script/console"

>> a.save

=> true

>> User.create :name => "Scott"

=> #<User:0x22289c4 @attributes={"name"=>"Scott", "id"=>1}>

>> u=User.find :first

=> #<User:0x223587c @attributes={"name"=>"Scott", "id"=>"1"}>

>> a.update_attributes :user_id => u.id

>> u.articles

=> [#<Article:0x222bc64 @attributes={"body"=>nil, "title"=>

"Using script/console", "id"=>"1", "user_id"=>"1"}>]

>> u.articles.create

=> #<Article:0x2223758 @attributes={"body"=>nil, "title"=>nil,    

"user_id"=>1}, @errors=#<ActiveRecord::Errors:0x2222efc, @errors={

"title"=>["can't be blank"]}>>

看看其中發生了什麼,首先,我們用new(未儲存)方法執行個體化了一個ActiveRecord對象,這個對象賦給了一個變量a,并且對于a的描述出現在了這句指令的下方(#<…>是ruby通過文本方式描述對象的标準方式)。因為ActiveRecord會自動為每一個資料庫字段建立讀取和指派的方法,是以你可以很輕易的改變對象的屬性(a.title=’…’),然後儲存記錄到資料庫中(a.save).

下一行顯示了同樣的過程,隻是将這個過程濃縮成了一句代碼,使用create方法。然後,使用update_attributes,我們建立兩個記錄之間的關系,并且通路了使用者(user)的文章(articles)這樣一個關系,結果傳回的是一個數組,數組内容是Article對象。最後,我們嘗試建立一個新的article,但是沒有成功,因為初始化的資料驗證失敗,錯誤在控制台中顯示了出來。

正如你所看到的,完整的ActiveRecord 接口在Rails控制台中都是可以使用的,是以籍此控制台成為和模型相關問題的一個重要的測試工具。

繼續閱讀