2012-10-07 40 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}