1

私のレールアプリには、次のコードがあります。

  def get_auth_token
    if auth_token = params[:auth_token].blank? && request.headers["auth_token"]
      params[:auth_token] = auth_token
    end
  end

誰かがifステートメントとここで何が起こるかを説明できますか? 私は ROR にあまり詳しくないので、この構文を理解するのに苦労しています。

4

2 に答える 2

3

最初の答えは間違っています。コードは大まかに次のように変換できます。

if params[:auth_token].blank?
  params[:auth_token] = request.headers["auth_token"]
end

つまり、params の「auth_token」が空白の場合、ヘッダーから「auth_token」に設定されます。trueブール演算子が Ruby で単一のブール値を返さないためだけに設定されているわけではありません。

true && "abcde" #=> "abcde"
nil || 42 #=> 42
nil && nil #=> nil

コードから条件を1つだけ省略しました。完全な翻訳は次のとおりです。

if params[:auth_token].blank? and request.headers["auth_token"]
  params[:auth_token] = request.headers["auth_token"]
end

唯一の違いはparams[:auth_token] = ""request.headers["auth_token"] = nilパラメーターが nil に変更されない場合です。これは非常に些細なことですが、あなたがこれを気にするかどうかはわかりません。

空白文字列が含まれていない場合は、Ruby の "or equal" 演算子を使用してより明確に表現できます。

params[:auth_token] ||= request.headers["auth_token"]
于 2013-05-31T03:08:43.933 に答える