Ruby on rails 控制器未保存属性(来自FB的Oauth令牌)
奇怪的问题-我的一个控制器中的创建操作没有保存属性-请查看下面的代码。所有的线路都能工作到最后2分钟。未保存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到期时间似乎有问题。然后,我尝试创建两
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)