2011-08-04 84 views
1

出於某種原因,我還沒有完全明白Rails如何與Ruby進行交互/弄清楚了Ruby本身。Ruby on Rails&調用帶有符號的方法基本問題

我會說點。例如,在一個Ruby on Rails項目中,你可能有這樣的事情:

class Product < ActiveRecord::Base 
default_scope :order => 'title' 
end 

這讓我很困惑。我假設我們正在調用產品從基類ActiveRecord類繼承的方法default_scope ...以便我們可以設置一些選項。我們傳遞它的符號:order =>'title'。是:在default_scope函數中只訂購一個散列值,並將該散列值設置爲「title」?我得到了正確的。

又例如,當你開始扔基本驗證在你得到這樣的事情

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 } 

我知道這是什麼一樣,但它的語法吹拂我的心靈。首先,它看起來像符號用於靜態重用字符串值,但在這裏我們發送一個動態符號...在哪裏呢?然後我們是符號內的符號嗎?這基本上是一個哈希內的散列或它到底是什麼?我只是想在我的大腦中找出它來真正理解正在發生的事情。

回答

5

您在假設default_scope是一個方法,它是從ActiveRecord的::基地繼承正確。前往here查看default_scope的源代碼。

這是一種採用可選散列的方法,因爲它只是參數

此,

default_scope :order => 'title' 

相同寫入它作爲,

default_scope({ :order => 'title' }) 

在紅寶石如果一個方法是像定義,

def foobar(options = {}) 
    p options 
end 

但是提防的語法細微差別。在上面,如果你遺漏了()保持{} ruby​​理解它是完全不同的東西。 Ruby看到一個方法default_scope,它接受code block作爲參數。

default_scope { # code block } 

這種方法定義的樣子,

def foobar(&block) 
    yield 
end 

要了解如何塊紅寶石工作read this

你可以這樣調用它,

foobar :key_1 => 'value_1', "key_2" => 'value_2' 

和Ruby的理解它是,

foobar({ :key_1 => 'value_1', "key_2" => 'value_2' }) 

哈希的按鍵可能會或可能不會符號。

至於該列屬性price驗證輔助方法,

validates :price, :numericality => { :greater_than_or_equal_to => 0.01 } 

相同,

validates(:price, { :numericality => { :greater_than_or_equal_to => 0.01 } }) 

這類似於一個方法定義等,

def validates(column_attr, options = {}) 
    # perform validation of column_attr 
end 
0
default_scope :order => 'title' 

是一個方法調用

default_scope({:order => 'title'}) 

的Ruby允許省略括號和大括號在這種情況下。

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 } 

裝置

validates(:price, {:numericalcity => {:greater_than_or_equal_to => 0.01 } }) 
+4

你的例子是錯誤的:'default_scope {:order =>'title'}'被認爲是一個塊而不是散列參數。你應該寫'default_scope({:order =>'title'})' – juandebravo