2016-01-25 118 views
1

rest_client gem有以下示例中的文件:參數傳遞給塊

RestClient.get('http://my-rest-service.com/resource'){ |response, request, result, &block| 
    case response.code 
    when 200 
    p "It worked !" 
    response 
    when 423 
    raise SomeCustomExceptionIfYouWant 
    else 
    response.return!(request, result, &block) 
    end 
} 

你怎麼知道什麼屬性可在上述每個塊的變量? responserequest等分別具有哪些屬性?當我運行rest_client

response = RestClient.get('http://www.google.com') 

很多東西都返回response

response.instance_variables # => [:@net_http_res, :@args, :@request, :@code] 
response.net_http_res # => #<Net::HTTPOK 200 OK readbody=true> 
response.args # => {:method=>:get, :url=>"http://www.google.com", :headers=>{}} 
response.code # => 200 

哪些部分的response可用來塊?參數的順序是否重要?

回答

3

通常,接受塊可選會說一些這樣的方法:

def f(...) 
    if block_given? 
    ... 
    yield thing1, thing2... 
    ... 
    return foo 
    else 
    ... 
    return bar 
    end 
end 

因此,並不需要是什麼之間的產生來將擋,並在情況下,返回了任何信件沒有阻止。

知道塊接收的方法是查看該方法的文檔或查閱源代碼。

是的,訂單很重要。寶石文件特別說RestClient#get給你response,request,和block;它也描述了這些東西是什麼。

0

我不知道你有特別的寶石,但在一般情況下,檢查類:

p response.class 

,然後尋找這個類的文檔,或直接看什麼方法它有做:

p response.methods 
1

process_result方法在restclient/request.rb

if block_given? 
    block.call(response, self, res, & block) 
    else 

這是塊被調用的地方。由於self這裏是Request,給出該塊的參數是response,request,resultblock本身按該特定順序。

僅當block_given?爲真時才調用該塊。因此,如您在問題中顯示的那樣,在沒有塊的情況下調用RestClient.get會給它一個不同的行爲。

塊的哪些部分可用?

整個Response對象被提供給塊作爲第一個參數。

參數的順序是否重要?

是的,參數的順序絕對重要。

0
response = RestClient.get('http://www.google.com') 

當您啓動此,你可以像response.methods可用的完整列表。這是非常大的,所以參考文檔/ github頁面的常用方法。所有方法的響應變量都可以使用並直接傳遞。

是的,這個參數的順序很重要。