2011-04-26 50 views
5

我正在使用twitter的gem。在回调中,检查用户是否存在并创建他或将他发回主页。
我可能会做错某事,但在我的回调代码中,request.env ['omniauth.origin']的零无效Omniauth - Origin is nil

我的代码非常简单:
whatever.html.erb

<%= link_to image_tag("twitter-connect.png"), "/auth/twitter" %> 

的routes.rb

match "/auth/:provider/callback" => "sessions#create" 

sessions_controller.rb

def create 
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) 
    if !user.email 
     redirect_to confirm_path, :notice => "Add your email!" 
    else 
     redirect_to request.env['omniauth.origin'] || root_url, :notice => "Signed in!" 
    end 
end 

如果我提出request.env ['omniauth.origin']在回调后,我得到一个对象。

感谢您的帮助!

+0

您正在使用哪个版本的omniauth? – 2011-04-26 16:23:08

+0

我问,因为,我认为新版本的omniauth存在与此相关的问题。 – 2011-04-26 16:34:49

+0

HI Aditya。我刚刚在0.2.4上更新了最新版本。 – Laurent 2011-04-26 17:34:02

回答

0

尝试版本0.2.0 - 我已经能够让这个版本在Rails 3.0.9和Ruby 1.9.2-p180没有任何问题的情况下工作。

  1. 不应该您的线以上读作

    用户= auth.find_by_provider_and_uid(AUTH [ “提供者”],AUTH [ “UID”])|| User.create_with_omniauth(auth)

  2. 至于omniauth.originnil,参见this discussion

+0

嗨迈克,thx的方向。 关于1),不知道=>我试图找到一个用户在auth中的信息,并创建他,如果我没有找到他。 – Laurent 2011-06-23 07:33:58

+0

嗯,我的观点是你不能'User.find_by_provider_and_uid'因为User模型没有提供者/ uid字段;最后我检查了'find_by_ *'动态查找器,可以仅指定该特定模型的属性。另一方面,您可以检查当前auth是否有关联的用户,即'如果current_user == auth.user'。看看我使用的逻辑[这里](https://github.com/bsodmike/omniauth_scratch/blob/50d9e9ca37dae1c69818a0454e301178ff3e0759/app/controllers/authentications_controller。RB);我采取了'如果current_user &&认证'的方法。 – 2011-06-23 08:16:04

0

您需要手动设置的原点在视图中的链接。在Rails 4中,request.original_url是最好的方法。

在你的link_to Twitter的按钮,可以手动设置的原点:

"/auth/twitter?origin=#{request.original_url}" 
在SessionsController

然后,当你重定向到request.env [ 'omniauth.origin'],它应该正常工作。