我的Rails应用程序上的深层链接问题

时间:2012-12-05 22:20:11

标签: ruby-on-rails deep-linking

编辑我已经在下面详细介绍了我的目标。

在使用Omninauth gem通过着陆页登录后,我无法深度将用户链接到我的网站。

最常见的情况是:用户收到一封电子邮件,其中包含指向该网站的深层链接 - 例如www.mysite.com/suggestions/15。我们在登录页面上放置了一个Facebook登录(通过Omniauth)(授权控制器上的def登陆页面 - 见下文)。当用户尝试访问任何其他页面而未登录时,他们会通过authenticate_user退回!辅助方法放在相关的控制器中。 authenticate_user在Application Controller中定义 - 见下文。

一旦他们被退回,他们点击着陆页上的“登录Facebook”按钮,我们通过def authcreate为用户创建一个会话。这适用于经典的omniauth方式,即来自facebook的回调,其捕获会话令牌。现在,此时我想将用户重定向到他们试图访问的页面(例如www.mysite.com/suggestions/15),而只是通过默认页面(www.mysite.com/suggestions)。当用户已经登录时,这不是问题,但是当他们注销时从不工作。

你可以忽略授权!因为这是一个与管理员权利有关的单独模块(我知道这令人困惑)。同样在check_authorization上。

我创建了一个模块并将其放入lib /

module RedirectModule

def self.included(controller)
controller.send :helper_method, :redirect_to_target_or_default
end

def redirect_to_target_or_default(default, *args)    
    redirect_to(session[:return_to] || default, *args)
    session[:return_to] = nil
end

def redirect_to_or_default(target, *args)
    redirect_to(target || default, *args)
end

private

def store_target_location # Friendly redirect: store URL.
    session[:return_to] = request.url 
end
end

ApplicationController中有一个include:

class ApplicationController < ActionController::Base

  protect_from_forgery
  check_authorization
  include RedirectModule

def current_user
  if session[:user_id]
  @current_user ||= User.find(session[:user_id])
  end
end

helper_method :current_user

def authenticate_user!
  if !current_user
store_target_location
redirect_to "/"
  end
end

我在以下控制器上启动会话:

class AuthorizationController < ApplicationController

  def landingpage
   authorize! :auth, :landingpage

    if current_user
      redirect_to_target_or_default('/suggestions')

    else

      store_target_location

    end  
  end

  def authcreate
    authorize! :auth, :authcreate
    reset_session
    authHash = env["omniauth.auth"]
    existingUser = User.where(authHash.slice(:provider, :uid)).first
    user = User.from_omniauth(authHash)
    session[:user_id] = user.id

    redirect_to_target_or_default('/suggestions')
  end

  def authdestroy
    authorize! :auth, :authdestroy
    session[:user_id] = nil
    redirect_to "/"
  end

end

我做错了什么?

0 个答案:

没有答案