Ruby on rails 控制器未保存属性(来自FB的Oauth令牌)

Ruby on rails 控制器未保存属性(来自FB的Oauth令牌),ruby-on-rails,omniauth,Ruby On Rails,Omniauth,奇怪的问题-我的一个控制器中的创建操作没有保存属性-请查看下面的代码。所有的线路都能工作到最后2分钟。未保存oauth\u令牌和oauth\u到期时间。我已经检查了属性是否正确命名,等等。有趣的是,如果我将第二行改为最后一行: omniauth['credentials']['token']?provider=omniauth['credentials']['token']:provider='' 它工作得非常好。实际属性oauth\u令牌和oauth\u到期时间似乎有问题。然后,我尝试创建两

奇怪的问题-我的一个控制器中的创建操作没有保存属性-请查看下面的代码。所有的线路都能工作到最后2分钟。未保存
oauth\u令牌
oauth\u到期时间
。我已经检查了属性是否正确命名,等等。有趣的是,如果我将第二行改为最后一行:

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

它工作得非常好。实际属性
oauth\u令牌
oauth\u到期时间
似乎有问题。然后,我尝试创建两个新的虚拟属性,看看它是否在那里工作-没有。似乎在
oauth\u令牌
之后创建的任何属性都会出错。这是移民问题吗?有什么想法吗

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

我不确定这是否是您的问题,但我认为您使用三元(
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
但是,既然你用它来做
attribute=value?值:默认值
,您可以通过对除最后一个之外的所有对象使用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
但是,这三种方法都可以工作,因此,
omniauth['credentials']['token']
不是正确的散列键,或者无论您稍后在控制器或模型中使用
oauth_token
oauth_expires_做什么都会导致问题


您能否编辑您的问题,以包含更多来自控制器和用户模型的代码?

我很不好意思承认问题的实质:

完全忘记了我后来在控制器中所做的事情。我喜欢粗心的错误

必须改变:

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)