1

いくつかの oAuth 値のセッション ハッシュをチェックし、存在しない場合は設定しています。これは私の既存のコードです:

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

3 に答える 3

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

とにかく is falsyに置き換えunless obj.nil?たことに注意してくださいif objnil有効な値を期待しない限りfalse、これは Ruby の典型的なイディオムです。

于 2012-10-07T22:08:21.497 に答える
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
于 2012-10-07T22:07:19.593 に答える
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}
于 2012-10-08T01:40:48.757 に答える