2012-10-07 126 views
1

我正在檢查某個oAuth值的會話散列,然後將它們設置爲不存在。這是我現有的代碼:這是做什麼更rubyesque的方式?

unless session[:oauth][:request_token].nil? && session[:oauth][:request_token_secret].nil? 
    @request_token = OAuth::RequestToken.new(@client, session[:oauth][:request_token], session[:oauth][:request_token_secret]) 
end 

...但它是討厭的,似乎並不特別紅寶石。有沒有更習慣寫作的方式?

回答

4

或許只是使用一些變量?

oauth = session[:oauth] 
token, secret = oauth.values_at :request_token, :request_token_secret 

if token && secret 
    @request_token = OAuth::RequestToken.new(@client, token, secret) 
end 

請注意,我因爲nilif obj代替你的unless obj.nil?是falsy反正。除非您希望false作爲有效值,否則這是典型的Ruby成語。

+0

太棒了,謝謝。我用'[:request_token,:blah] .each'嘗試了各種各樣的東西,但越簡單越好! –

2

我會寫:

oauth = session[:oauth] 
if (token = oauth[:request_oken]) && (secret = oauth[:request_token_secret) 
    @request_token = OAuth::RequestToken.new(@client, token, secret) 
end 

或者:

token, secret = session[:oauth].values_at(:request_token, :request_token_secret) 
@request_token = OAuth::RequestToken.new(@client, token, secret) if token && secret 
+0

就像我的'values_at',是嗎? ';'' –

+0

發誓我在看到你之前更新了它......當我看到它是相同的時候,我重新添加了我的第一個片段。 – tokland

+0

哈哈,無論如何我不介意。 –

0

還有一種方法:

session[:oauth].tap do |h| 
    [h[:request_token], h[:request_token_secret]].tap do |t1, t2| 
    @request_token = OAuth::RequestToken.new(@client, t1, t2) if t1 and t2 
    end 
end 

事實上,我會用我定義的,通常使用自己下面的方法。

class Object 
    def chain ≺ pr.call(self) end 
end 

然後,你能避免嵌套,代碼會好一點:

session[:oauth] 
.chain{|h| [h[:request_token], h[:request_token_secret]]} 
.tap{|t1, t2| @request_token = OAuth::RequestToken.new(@client, t1, t2) if t1 and t2}