ruby-on-rails - 设计 stored_location_for(resource) 返回 nil

标签 ruby-on-rails devise

我在这里阅读了几篇关于 stored_location_for 故障排除的帖子,但似乎无法弄清楚,也不知道如何排除故障。

我尝试删除我的自定义 after_sign_in_path_for,但这也没有用。我的位置永远不会被保存,尽管据我所知,在每次 session /页面更新后它应该存储位置。我需要手动通过它作为过滤器吗?

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

最佳答案

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

假设你的用户模型被命名为“user”那么

  1. 在您的 Controller 中调用 store_location_for(:user, my_desired_pa​​th) 将在 session 中使用键“user_return_to”存储 URL“my_desired_pa​​th”。基本上这种方法会简单地做到这一点 - session["user_return_to"] = my_desired_pa​​th.可能你错过了这个。我有一个预订 Controller 和一个“登录”操作,它将结帐位置存储在预订 Controller 中,然后在渲染 View 中为用户显示一个登录表单 -

    def login
        my_desired_path = url_for(controller: 'bookings', action: 'checkout')
        store_location_for(:user, my_desired_path)
    end
    
  2. 现在您可以使用 stored_location_for(:user) 从 session 中检索 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”。

附加点 -

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

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

  1. 页面 A 中的用户 - store_location_for(:user, "\X") 保存在 session 中。
  2. 应用程序提供了一个登录表单,但用户没有登录,只是在您的应用程序中到处浏览。
  3. 用户在页面 B 上执行登录,期望登陆“\Y”,但意外登陆“\X”。

因此,请在您的应用程序中处理好它。这种情况更可能发生在使用 AJAX 登录的应用程序中。

关于ruby-on-rails - 设计 stored_location_for(resource) 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894116/

相关文章:

sql - 如何在 Rails 控制台中查询表

ruby-on-rails - rails : Is there a rails trick to adding commas to large numbers?

ruby-on-rails - 我已经完成 "brew install postgresql"得到 9.0.2 但运行 "gem install pg"我缺少库

ruby-on-rails - 确认后是否可以添加到 Flash 消息的链接?

ruby-on-rails-3 - 如何在 rspec 中使用 current_user 进行序列化器测试

ruby-on-rails - 使用 will_paginate gem 在 Rails 3.2.3 中调用 Ajax

css - Bootstrap 图标不起作用

ruby-on-rails - 为登录用户设计忘记密码

ruby-on-rails-3 - 使用 Devise+Active Admin+Switch User 登录其他用户的帐户

ruby-on-rails - 在创建用户帐户时自定义设计用户 JSON 响应