Devise stored_location_for(resource)返回nil

时间:2014-02-19 22:36:34

标签: ruby-on-rails devise

我在这里阅读了几篇有关排查stored_location_for的帖子,但似乎无法弄明白并且不确定如何进行问题排查。

我尝试删除我的自定义after_sign_in_path_for,但这也不起作用。我的位置永远不会被保存,虽然我理解它在每次会话/页面更新后它应该存储位置。我是否需要手动过滤?

def after_sign_in_path_for(resource)
    stored_location_for(resource) ||
      if resource.is_a?(Account)
        add_quote_to_account(resource)
        if resource.applications.any?
          edit_application_path(resource.applications(true).last)
        else
          root_path
        end
      else
        super
      end
  end

1 个答案:

答案 0 :(得分:6)

使用devise登录后,您可能没有存储要重定向的位置。 Devise提供了两种方法 - store_location_for和stored_location_for https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/store_location.rb

假设您的用户模型名为“user”,然后命名为

  1. 在控制器中调用store_location_for(:user,my_desired_pa​​th)会将URL“my_desired_pa​​th”存储在会话中,密钥为“user_return_to”。基本上这个方法只会这样做 - session [“user_return_to”] = my_desired_pa​​th。可能你错过了这个。我有一个预订控制器和一个“登录”操作,它将预订的结账位置存储在预订控制器中,然后在渲染视图中显示用户的登录表单 -

    def login
        my_desired_path = url_for(controller: 'bookings', action: 'checkout')
        store_location_for(:user, my_desired_path)
    end
    
  2. 现在您可以使用stored_location_for(:user)从会话中检索my_desired_pa​​th。因此,对stored_location_for(:user)的调用将返回“my_desired_pa​​th。

  3. 现在,如果您在自定义的after_sign_in_path_for(:user)中使用stored_location_for,那么它将返回“my_desired_pa​​th”。

  4. 附加要点 -

    对stored_location_for(:user)的调用会返回会话[:user_return_to],但在返回值后,如果您的重定向格式为导航格式,则会清除此会话。因此,对stored_location_for(:user)的第二次调用将不会返回my_desired_pa​​th。有时这就是我们希望应用程序运行的方式。相反,如果您的重定向格式不是导航格式,则会话不会被清除,第二次登录将再次重定向到相同的“my_desired_pa​​th”。

    有时您希望从应用程序中的不同页面重定向到登录的不同位置。假设您想要重定向到第A页的“\ X”和第B页的“\ Y”。现在请按照以下步骤操作 -

    1. 第A页上的用户 - store_location_for(:user,“\ X”)保存在会话中。
    2. 应用程序提供登录表单,但用户不会登录,只是在您的应用程序中随处浏览。
    3. 用户在B页上并执行登录,希望登陆“\ Y”,但意外登陆“\ X”。
    4. 因此,请在您的应用程序中处理它。在使用AJAX进行登录的应用程序中更有可能发生这种情况。