1

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

我的要求:能够说“用户想要在订阅时显示项目 X(如 item/:id 是请求的 url)”。只要有可能,它就会告诉用户在注册时想要查看的应用程序的哪个项目。

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

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

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

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。在新操作期间,我可以在会话变量中看到它,但是一旦创建,我就找不到它。

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

4

2 回答 2

2

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

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
于 2013-05-15T17:43:45.260 回答
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)但不会删除的内容。

于 2013-05-15T14:57:14.757 回答