传递变量以在 DeDesigning 中查看

Pass variables to view within Devise

本文关键字:DeDesigning 变量      更新时间:2023-09-26

我正在使用Devise 3.2.4。我用这个覆盖了会话控制器:

  def create
    super do |resource|
      @just_signed_in = true
    end
  end

目标是能够在视图中使用变量@just_signed_in,以触发仅在登录时调用的前端 JavaScript。以下是我的after_sign_in_path_for(resource)的定义:

  def after_sign_in_path_for(resource)
    return root_path
  end

鉴于return root_path,我认为这不允许将@just_signed_in传递给视图。如何在用户登录后触发 JavaScript?我错过了什么吗?

干杯

我认为您的变量对视图不可用的原因是 devise 的create在屈服于设置@just_signed_in的块后执行的respond_with。 如果一切都成功,那么这个respond_with将执行一个redirect_to,所以你的@just_signed_in变量将无法存活下来,无法提供给处理你的root_path的控制器(参见actionpack/lib/controller/metal中rails操作包中ActionController模块中的navigation_behaviour(),其中显示了成功的redirect_to或失败的渲染(。

解决此问题的一种方法是按照 Rich 的建议向resource添加一个属性,然后您可以使用视图中的current_user来获取它并检查/重置它(理想情况下,在模型中使用逻辑而不是视图(。 如果不想向资源/模型添加属性,另一种方法是将"刚登录"标志放在会话中,然后在视图中访问/删除它。 即代替:

@just_signed_in = true

有:

session[:just_signed_in] = true

然后在您的视图中,执行以下操作:

if session.delete(:just_signed_in)
  …whatever…
end

您可能希望在视图帮助程序中隐藏它,尤其是在多个位置需要它时。

这是Devise sessions#create的来源:

def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_flashing_format?
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
end

--

问题

我认为您的问题是您在设置@just_signed_in变量之前调用super。据我所知,以这种方式调用super将调用您尝试附加的整个方法[需要研究如何使用super do |var|]...

如果我的理论是正确的,这意味着你的@just_signed_in变量没有被设置,从而阻止它可用。我最初认为after_sign_in_path_for会是一个redirect,但由于它只是设置位置,如果正确完成,它应该设置变量

更新

此后,我找到了您使用的参考资料:

class Admins::SessionsController < Devise::SessionsController
  def create
    super do |resource|
      BackgroundWorker.trigger(resource)
    end
  end
end

修复

您需要做几件事:

确保您的sessions_controller覆盖正常工作

您尚未发布您的班级声明 为您的sessions_controller .这可能看起来很简单,但最简单的事情往往会导致最大的错误!

你需要有这个:

#config/routes.rb
devise_for :users, controllers: { sessions: "your/sessions" }
#app/controllers/sessions_controller.rb
Class SessionsController < Devise::SessionsController
   ... 
end

-

确保已设置@just_signed_in变量

由于多种原因(重定向等(,您的变量可能在视图中不可用。我强烈建议设置一些logs来跟踪您是否设置了@just_signed_in变量:

#app/controllers/sessions_controller.rb
def create
   super do |resource|
       @just_signed_in = true
       Rails.logger.info(@just_signed_in.inspect)
   end
end

这至少可以确认变量是否已设置(因此会有其他故障(

-

查看@just_signed_in在哪里可用

在第二步之后,我将尝试查看@just_signed_in在哪里可用。我会通过将值附加到您的resource,然后在您的after_sign_in_path_for(resource)方法中使用logger来做到这一点:

#app/models/user.rb
Class User < ActiveRecord::Base
   attr_accessor :just_signed_in
end
#app/controllers/sessions_controller.rb
def create
    super do |resource|
        resource.just_signed_in = true
    end 
end
def after_sign_in_path_for(resource)
    Rails.logger.info(resource.just_signed_in.inspect)
end

我希望这有所帮助 - 我不知道这些是否有效,但它肯定会创造一个更好的环境来发现答案!