如何从通过Devise订阅的用户收集请求的URL

时间:2013-05-08 11:54:16

标签: ruby-on-rails devise subscription

我正在使用rails 3.我的整个应用仅限于使用Devise 2.2的注册用户。

我的要求: 当他订阅时,能够说“用户想要显示项目X(如项目/:id是请求的网址)”。只要有可能,它就会告诉用户注册时应该看到的应用程序项目。

示例:John单击www.website/item/48链接,但他未注册到系统中。在设计将他重定向到设计登录页面后,他注册并被重定向(标准设计行为)到www.website/item/48。之后,该网站的管理员能够看到该用户john@whatever.net创建了一个帐户,因为他想查看第48项。

目前设计是最经典的方式,在我的所有控制器中都有before_filter :authenticate_user!。 login / subscrition页面与默认页面类似,但设计除外。

我已经覆盖了设计的默认注册控制器:

class RegistrationsController < Devise::RegistrationsController

  def new
    super
    logger.debug"--------------------------------"
    logger.debug session.inspect
    logger.debug params.inspect 
    logger.debug resource
    logger.debug"--------------------------------"
  end

  def create
    super
    logger.debug"-----------------------------------"
    logger.debug session.inspect
    logger.debug params.inspect 
    logger.debug resource.inspect
    logger.debug"-----------------------------"
  end
end

我不清楚如何从Devise获取请求的URL。我可以在新操作期间在会话变量中看到它,但是一旦在创建中我找不到它。

如何在Devise的创建操作中获取并保存请求的URL?

2 个答案:

答案 0 :(得分:2)

是的,您可以覆盖sign_up方法并使用以下代码获取该网址:

def sign_up(resource_name, resource)
  scope = Devise::Mapping.find_scope!(resource_or_scope)
  url = session["#{scope}_return_to"] # here is your url

  super
end

答案 1 :(得分:1)

您应该覆盖注册控制器中的sign_up方法,如下所示:

def sign_up(resource_name, resource)
  scope = Devise::Mapping.find_scope!(resource))
  path = session["#{scope}_return_to"] || signed_in_root_path(scope)
  logger.debug("Requested path before sign up: #{path}")
  sign_in(resource_name, resource)
end

如果您想以其他方式存储它,您当然可以更改logger.debug。重要的部分是session["#{scope}_return_to"] || signed_in_root_path(scope)

这将返回与after_sign_up_path_for(resource)相同但不删除会话中的引荐来路径。