Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ractController::DoubleRenderError。事实上,您没有得到一个双渲染器,这表明登录和重定向有问题_Ruby On Rails_Devise_Oauth 2.0_Google Oauth_Helpers - Fatal编程技术网

Ruby on rails ractController::DoubleRenderError。事实上,您没有得到一个双渲染器,这表明登录和重定向有问题

Ruby on rails ractController::DoubleRenderError。事实上,您没有得到一个双渲染器,这表明登录和重定向有问题,ruby-on-rails,devise,oauth-2.0,google-oauth,helpers,Ruby On Rails,Devise,Oauth 2.0,Google Oauth,Helpers,现在,我不知道登录和重定向有什么问题,所以让我们检查一下源代码: # File 'lib/devise/controllers/helpers.rb', line 159 def sign_in_and_redirect(resource_or_scope, *args) options = args.extract_options! scope = Devise::Mapping.find_scope!(resource_or_scope) resource = args.

现在,我不知道
登录和重定向有什么问题,所以让我们检查一下源代码:

# File 'lib/devise/controllers/helpers.rb', line 159
def sign_in_and_redirect(resource_or_scope, *args)
  options  = args.extract_options!
  scope    = Devise::Mapping.find_scope!(resource_or_scope)
  resource = args.last || resource_or_scope
  sign_in(scope, resource, options)
  redirect_to after_sign_in_path_for(resource)
end
我猜这与查找用户范围有关,因为它的其余部分看起来不错,而且可能您的映射配置不正确

为了避免任何歧义(以及我期望出现的
DoubleRenderError
),请尝试用以下代码替换上述代码:

if proceeder
  user = User.from_omniauth(auth)
    flash.notice = "Signed in!"
    sign_in :user, user
    redirect_to :root
让我知道这是否有效,如果不行,我将再次尝试


另外,在您通过Google验证后,您是否看到flash消息“Signed in!”?

您是否在日志中看到有关CSRF的任何警告?我没有看到,但我正在使用此gem,如果该帮助信息将日志附加到问题中,请尝试将protect_from_fackery with::exception添加到您的应用程序控制器中。如果它与CSRF相关,您将看到一个异常,而不是“null”会话,这是默认行为。@jquarin:查看我的editI有我自己的用户表,新用户将保存到其中(在oauth重定向并给我“确定”后)。当用户登录时,如果他们存在于用户数据库表中,则他们已登录,否则他们是新用户,并为他们创建了新记录。登录需要创建一个会话变量,该变量由
user\u signed\u in?
helper方法访问。登录页面只是一个谷歌按钮,它会导致谷歌登录,最终是一个回调免责声明:我没有读你的代码。根据Tim的回答和您的评论,您似乎混淆了“新用户”和“登录”用户。新用户只有在其会话存在时才能登录。一旦会话到期,他将“注销”。Oauth与用户会话无关,因此我怀疑这种混乱可能是问题的原因。您需要管理自己的会话。好的,是的,我理解这一点,但Desive管理会话。阅读我的代码我不认为这是CSRF错误。如果是,日志中会有一个警告。如果user.persistend,我应该怎么做?@anuj arora这是一个很好的观点,尽管这与Jquarin在DB中创建用户的说法相冲突。看起来电子邮件实际上是被设置的。在示例中,它刚刚被截断。您是否可以发布其余的
self.from\u omniauth
方法?我刚刚发布了它,我没有意识到它被截断了。请打印出
user。在您的行
user=user.from\u omniauth(auth)后检查
并粘贴到这里,这样我们就可以看到用户对象是如何创建的?如果是这样,我可以自己调试,
user
的属性都存在并且创建正确
class PostsController < ApplicationController
...
def login
    Rails.logger.debug(current_user)
    if current_user
            redirect_to :root
    end
end
...
class ApplicationController < ActionController::Base
  protect_from_forgery
  serialization_scope :view_context

  def after_sign_in_path_for(resource)
    root_url
  end
  def after_sign_up_path_for(resource)
    root_url
  end
end
>> Listening on 0.0.0.0:3000, CTRL+C to stop


Started GET "/signup" for 127.0.0.1 at 2013-11-16 16:58:54 -0500
Processing by PostsController#login as HTML

  Rendered posts/login.html.erb within layouts/application (24.0ms)
Completed 200 OK in 31ms (Views: 30.6ms | ActiveRecord: 0.0ms)
(google_oauth2) Request phase initiated.


Started GET "/users/auth/google_oauth2" for 127.0.0.1 at 2013-11-16 16:58:56 -0500
(google_oauth2) Callback phase initiated.


Started GET "/users/auth/google_oauth2/callback?state=e5c02458190b79758da474baa623717a29078427ad6049f7&code=4/yimrxaCXMOY_FTZyAgd_-CpZxMrF.EhatByjkrMkYshQV0ieZDAoQx9zFhAI" for 127.0.0.1 at 2013-11-16 16:59:00 -0500
Processing by OmniauthCallbacksController#google_oauth2 as HTML
  Parameters: {"state"=>"e5c02458190b79758da474baa623717a29078427ad6049f7", "code"=>"4/yimrxaCXMOY_FTZyAgd_-CpZxMrF.EhatByjkrMkYshQV0ieZDAoQx9zFhAI"}
  User Load (54.0ms)  SELECT "users".* FROM "users" WHERE "users"."email" = 'jquadr01@foobar.com' LIMIT 1
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."provider" = 'google_oauth2' AND "users"."uid" = '105565017494971239846' LIMIT 1
   (0.1ms)  BEGIN
  User Exists (0.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'jquadr01@foobar.com' LIMIT 1
   (0.1ms)  ROLLBACK
   (0.1ms)  BEGIN
  SQL (76.2ms)  INSERT INTO "users" ("created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "last_sign_in_at", "last_sign_in_ip", "provider", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "uid", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) RETURNING "id"  [["created_at", Sat, 16 Nov 2013 21:59:01 UTC +00:00], ["current_sign_in_at", Sat, 16 Nov 2013 21:59:01 UTC +00:00], ["current_sign_in_ip", "127.0.0.1"], ["email", "jquadr01@foobar.com"], ["encrypted_password", ""], ["last_sign_in_at", Sat, 16 Nov 2013 21:59:01 UTC +00:00], ["last_sign_in_ip", "127.0.0.1"], ["provider", "google_oauth2"], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", 1], ["uid", "1055650112345678911846"], ["updated_at", Sat, 16 Nov 2013 21:59:01 UTC +00:00]]
   (16.9ms)  COMMIT
#<User:0x000000020d7a08>
Redirected to http://localhost:3000/
Completed 302 Found in 338ms (ActiveRecord: 162.0ms)


Started GET "/" for 127.0.0.1 at 2013-11-16 16:59:01 -0500
Processing by MainController#index as HTML
  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT 1
Redirected to http://localhost:3000/signup
Completed 302 Found in 5ms (ActiveRecord: 0.8ms)


Started GET "/signup" for 127.0.0.1 at 2013-11-16 16:59:01 -0500
Processing by PostsController#login as HTML

  Rendered posts/login.html.erb within layouts/application (0.5ms)
Completed 200 OK in 4ms (Views: 2.7ms | ActiveRecord: 0.0m
skip_before_filter :verify_authenticity_token
if proceeder
  user = User.from_omniauth(auth)
    flash.notice = "Signed in!"
    sign_in_and_redirect user
    redirect_to :root
# File 'lib/devise/controllers/helpers.rb', line 159
def sign_in_and_redirect(resource_or_scope, *args)
  options  = args.extract_options!
  scope    = Devise::Mapping.find_scope!(resource_or_scope)
  resource = args.last || resource_or_scope
  sign_in(scope, resource, options)
  redirect_to after_sign_in_path_for(resource)
end
if proceeder
  user = User.from_omniauth(auth)
    flash.notice = "Signed in!"
    sign_in :user, user
    redirect_to :root