0

奇妙な問題 - 私のコントローラーの 1 つで作成アクションが属性を保存していません - 以下のコードをチェックしてください。最後の 2 行まですべての行が機能します。oauth_tokenと はoauth_expires_at保存されていません。属性に適切な名前が付けられていることなどを確認しました。面白いことに、最後から2行目を次のように変更すると:

omniauth['credentials']['token'] ? provider = omniauth['credentials']['token'] : provider = ''

それは完全にうまく機能します。実際の属性oauth_tokenoauth_expires_at. 次に、2 つの新しいダミー属性を作成して、そこで機能するかどうかを確認しようとしましたが、機能しません。後で作成された属性oauth_tokenが台無しになっているようです。これは移行の問題ですか? 何か案は?

def create
    params[:authorization] ? authorization_route = params[:authorization] : authorization_route = 'no authorization (invalid callback)'

    omniauth = request.env["omniauth.auth"]
    if omniauth and params[:authorization]
        if authorization_route == "facebook"
              omniauth['extra']['raw_info']['email'] ? email =  omniauth['extra']['raw_info']['email'] : email = ''
              omniauth['extra']['raw_info']['name'] ? name =  omniauth['extra']['raw_info']['name'] : name = ''
              omniauth['extra']['raw_info']['id'] ?  uid =  omniauth['extra']['raw_info']['id'] : uid = ''
              omniauth['provider'] ? provider =  omniauth['provider'] : provider = ''
              omniauth['credentials']['token'] ? oauth_token =  omniauth['credentials']['token'] : oauth_token = ''
              omniauth['credentials']['expires_at'] ? oauth_expires_at =  Time.at(omniauth['credentials']['expires_at']) : oauth_expires_at = ''
end
   end
4

2 に答える 2

1

これがあなたの問題かどうかはわかりませんが、三項 ( condition ? value : other_value) 構文の使用方法は典型的ではありません。通常、次のように記述します。

def create
  authorization_route = params[:authorization] ? params[:authorization] : 'no authorization (invalid callback)'

  omniauth = request.env["omniauth.auth"]
  if omniauth and params[:authorization]
    if authorization_route == "facebook"
      email = omniauth['extra']['raw_info']['email'] ? omniauth['extra']['raw_info']['email'] : ''
      name = omniauth['extra']['raw_info']['name'] ? omniauth['extra']['raw_info']['name'] : ''
      uid = omniauth['extra']['raw_info']['id'] ? omniauth['extra']['raw_info']['id'] : ''
      provider = omniauth['provider'] ? omniauth['provider'] : ''
      oauth_token = omniauth['credentials']['token'] ? omniauth['credentials']['token'] : ''
      oauth_expires_at = omniauth['credentials']['expires_at'] ? Time.at(omniauth['credentials']['expires_at']) : ''
    end
  end
  # ...
end

しかし、これを do に使用しているので、最後のものを除くすべてattribute = value ? value : defaultに or ( ) 演算子を使用して、さらに単純化できます。||

def create
  authorization_route = params[:authorization] || 'no authorization (invalid callback)'

  omniauth = request.env["omniauth.auth"]
  if omniauth and params[:authorization]
    if authorization_route == "facebook"
      email = omniauth['extra']['raw_info']['email'] || ''
      name = omniauth['extra']['raw_info']['name'] || ''
      uid = omniauth['extra']['raw_info']['id'] || ''
      provider = omniauth['provider'] || ''
      oauth_token = omniauth['credentials']['token'] || ''
      oauth_expires_at = omniauth['credentials']['expires_at'] ? Time.at(omniauth['credentials']['expires_at']) : ''
    end
  end
  # ...
end

ただし、3 つの方法はすべて機能するためomniauth['credentials']['token']、適切なハッシュ キーではないかoauth_tokenoauth_expires_at後でコントローラーまたはモデルで行っていることが問題を引き起こしています。

質問を編集して、コントローラーとユーザー モデルからのコードをさらに含めることはできますか?

于 2013-04-18T20:28:10.897 に答える
0

問題が実際に何であるかを認めるのは恥ずかしいです:

後でコントローラーで何をしていたかを完全に忘れていました。ケアレスミスが好きだなぁ…

変更する必要がありました:

user.authorizations.build(:provider => provider, :uid => uid, :name => name, :email => email, :user_id => user.id)

に:

user.authorizations.build(:provider => provider, :uid => uid, :name => name, :email => email, :user_id => user.id, :oauth_token => oauth_token, :oauth_expires_at => oauth_expires_at)
于 2013-04-18T20:34:40.970 に答える