2012-10-07 6 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

는 아마도 그냥 변수를 사용을? 내가 nil 년부터 if obj으로 unless obj.nil? 교체 한

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 

참고 어쨌든 falsy입니다. 유효한 값으로 false을 기대하지 않는다면, 이것은 일반적인 루비 관용구입니다.

+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} 
관련 문제