使用Rails,Devise和Omniauth访问哪个控制器和操作

时间:2015-12-17 16:47:17

标签: ruby-on-rails facebook devise omniauth

我在我的Rails 4应用程序中使用Devise和Omniauth。在我看来,我有一个“登录Facebook”按钮,可以将用户引导至user_omniauth_authorize_path(:facebook)。这按预期工作,并将用户发送到/users/auth/facebook。然后,该URL似乎正确地将用户重定向到Facebook登录页面。

如何确定此重定向使用的控制器/操作?我想在重定向到Facebook之前设置return_url。通过继承Devise版本并添加我的代码,我能够在常规SessionRegistration控制器中执行此操作,如下所示:

class Users::SessionsController < Devise::SessionsController
  def new
    return_url = params[:return_url]
    store_location_for(:user, return_url) unless return_url.nil?
    super
  end
end

然后,我告诉设计使用我的新控制器:

devise_for :users, controllers: { sessions: 'users/sessions' }

我正在尝试使用omniauth功能完成同样的事情?有没有办法找出用户访问/users/auth/facebook时访问哪个控制器?如果是这样,我可以将其子类化并以与上面相同的方式添加功能吗?

更新

我通过运行'rake routes'找到了控制器/动作。这就是它所说的:

user_omniauth_authorize    GET|POST    /users/auth/:provider(.:format)     users/omniauth_callbacks#passthru {:provider=>/facebook/}

所以我能够找到正在使用的passthru方法,但这让我更加困惑。它位于Devise::OmniauthCallbacksController并说:

def passthru
  render status: 404, text: "Not found. Authentication passthru."
end

我很困惑这种方法导致用户被重定向到Facebook。

1 个答案:

答案 0 :(得分:0)

看起来您可以将参数传递给user_omniauth_authorize_path,然后使用request.env["omniauth.params"]在回调网址中检索它们。所以,我将链接更改为:user_omniauth_authorize_path(:facebook, { return_url: '/test_redirect_path' }

然后在我的OmniauthCallbacksController中我添加了:

store_location_for(:user, request.env["omniauth.params"]["return_url"]) 在致电sign_in_and_redirect @user之前。

这似乎已经成功了。