传递变量以在Devise中查看

时间:2014-05-29 04:40:34

标签: javascript ruby-on-rails devise

我正在使用Devise 3.2.4。我用这个覆盖了SessionsController:

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

目标是能够在视图中使用变量@just_signed_in,以便触发只应在登录时调用的前端JavaScript。以下是我after_sign_in_path_for(resource)的定义方式:< / p>

  def after_sign_in_path_for(resource)
    return root_path
  end

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

干杯,

2 个答案:

答案 0 :(得分:1)

我认为你的变量不适用于视图的原因是因为respond_with是在设置了@just_signed_in的块之后由设计create执行的。如果一切都成功,那么此respond_with将执行redirect_to,因此您的@just_signed_in变量将无法生效,以便处理您的root_path的控制器可用(请参阅navigation_behaviour()actionpack/lib/controller/metal中的rails'actionpack中的ActionController模块中,显示redirect_to表示成功或呈现失败)。

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

@just_signed_in = true

有:

session[:just_signed_in] = true

然后在您看来,执行以下操作:

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

您可能希望在视图助手中隐藏它,特别是如果您需要在多个位置使用它。

答案 1 :(得分:0)

ThisDevise 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

-

<强>问题

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

如果我的理论是正确的,则意味着您的@just_signed_in变量未被设置,从而阻止其可用。我原先假设after_sign_in_path_forredirect,但是因为它只是设置位置, 应该变量集如果它已正确完成

<强>更新

此后我发现了reference you used

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,然后在logger方法中使用after_sign_in_path_for(resource)来执行此操作:

#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

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