2012-07-26 62 views
3

我是紅寶石和鐵軌的新手。有人能指出什麼是下面的結構。我在方法(def)中看到respond_to構造。那麼它是一種方法內的方法嗎?我的意思是我試圖理解這裏的語言結構。Rails中的Ruby語言結構是「respond_to do | x | .. end」嗎?

我明白它的功能,即以給定的格式發送響應。

respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @posts } 
    end 
+0

它('respond_to')是一個正在傳遞塊(**關鍵字!**)的方法。另外,它應該是'end',而不是'ends' .. – 2012-07-26 06:30:18

+0

它就像是一個自動執行的方法嗎? – murtaza52 2012-07-26 06:33:17

+2

這取決於方法('respond_to')*調用*所需的塊(帶「yield」)。例如,Array.each'將爲每個元素*調用一次塊*(這對於空數組是完全不相同的;)。塊與匿名函數*類似,正如在JavaScript中常用的那樣。然而,它們不是*一級值(在該方法中,塊可以通過使用'&block'語法由'Proc'提升/提升)。 – 2012-07-26 06:33:44

回答

3

的語言結構是紅寶石塊。但是,如果你真的想了解respond_to這裏有一個博客帖子,提供了一個很好的概述

How does respond_to work?

最關鍵的事情要明白的是,respond_to代碼是一種方法連接到 你的控制器超:ActionController的,和我們被傳遞 作爲參數一種叫做塊:

...

的方法的respond_to裏面,我們最終與需要一個Proc一個是 的說法。這個參數有調用它的.xml和.html方法。 當我們在respond_to中調用 時,我們傳入Proc作爲參數的是什麼?我們傳入一個Responder類的實例。

所以我們最終調用的.html和.xml的響應 類的實例,因爲它是通過成塊(這是被轉換爲一個Proc) 的方法的respond_to裏面...呼。

+0

因此,在響應者(格式)類的實例上調用了html和json方法。那麼這是否意味着Rails會針對這兩種方式返回響應? – murtaza52 2012-07-28 14:49:43

+0

是的,如果你使用'website/book.js'和html代替'website/book.html',那麼rails會返回json。 – Dty 2012-07-28 16:13:51

2

它已關閉。這就像使用其他語言的功能,我。即在Ruby中,你有兩個選擇來遍歷集合:

for elem in collection 
    # do something 
end 

collection.each do |elem| 
    # do something 
end 

有這兩者之間的差別,但這裏我就不形容了。所以你可以看到它就像傳遞一個函數到方法裏面一樣。但是也有兩種方法可以通過阻止,使用do |variables| ... end塊或{ |variables| ... }塊。如果你想編寫自己的方法接受塊有再次是做到這一點的方法不止一種(他們是有點不同,但會運行相同的方式):

def run_3_times 
    yield 
    yield 
    yield 
end 

def run_3_times(&block) 
    block.call 
    block.call 
    block.call 
end 

兩個他們被稱爲以同樣的方式:

run_3_times { puts 'hello' } 
# will yield 
hello 
hello 
hello 

,但會導致當塊沒有通過另一個錯誤:

# when using yield 
LocalJumpError: no block given (yield) 

# when using Proc.call 
NoMethodError: undefined method `call' for nil:NilClass 
from (pry):8:in `run_3_times' 

這裏有一些文章吧:

+0

你很少看到'for ...在...中。 – Reactormonk 2012-07-26 09:43:22

+0

Becouse' for ... in'不引入新的範圍。 – Hauleth 2012-07-27 04:18:24

-1

On Ruby .respond_to?是一種測試方法。其中一件事是拍一個符號,並返回一個true如果對象可以接收方法,則返回如果不是,則返回false
例如,:
[1,2,3] .respond_to?(:推) 將返回真,因爲你可以陣列對象調用.push。 然而
[1,2,3] .respond_to?(:to_sym) 將返回,因爲你不能把一個陣列成符號

鏈接:
一個] Ruby是面向什麼方法調用答案,而不是什麼類型的對象。 respond_to?