Rails ActiveSupport ::关注和方法评估

时间:2017-12-01 05:19:42

标签: ruby-on-rails ruby devise activesupport-concern

我有这个应用程序使用带有current_user帮助器的Devise。当我创建模块时,current_user在我提及其归属后变为nil,即使它从未发生过。

class PagesController < ApplicationController
  include ModuleTest

  def index
    a_test_method
  end
end

ModuleTest

module ModuleTest
  extend ActiveSupport::Concern

  def a_test_method
    puts "(BEFORE)===========> #{current_user.inspect}"
    current_user = nil if false
    puts "(AFTER) ===========> #{current_user.inspect}"
  end
 end

输出:

(BEFORE)===========> #<User id: 1>
(AFTER) ===========> nil

,如果我删除/注释掉此行# current_user = nil if false,则current_user仍然有效:

(BEFORE)===========> #<User id: 1>
(AFTER) ===========> #<User id: 1>

这有点与懒惰的评价有关吗?

修改

整个问题依赖于Ruby在未评估语句时如何定义变量:

2.3.4 (main):0 > defined? this_never_seen_variable_before
=> nil
2.3.4 (main):0 > this_never_seen_variable_before = "value" if false
=> nil
2.3.4 (main):0 > defined? this_never_seen_variable_before
=> "local-variable"
2.3.4 (main):0 >
2.3.4 (main):0 > this_never_seen_variable_before_2
   NameError: undefined local variable or method `this_never_seen_variable_before_2' for main:Object
from (pry):119:in `<main>'
2.3.4 (main):0 > this_never_seen_variable_before_2 = "value" if false
=> nil
2.3.4 (main):0 > this_never_seen_variable_before_2
=> nil
2.3.4 (main):0 >

这是如何在下面工作的?

1 个答案:

答案 0 :(得分:2)

  1. Field to check: Request Header Reference Name: var Regular Expression: X-User-Id: (\w+.) Template: $1$ Match No: 1 是由Devise提供的帮助方法,而不是本地变量。

  2. 没有名为current_user的辅助方法。您可以通过将current_user=更改为current_user = nil并看到它崩溃来证明这一点。但这与您的问题无关。

  3. 结果是,您在2 self.current_user = nil之间定义了一个局部变量current_user,它使用相同的名称隐藏了辅助方法。

    奇怪的是,虽然由于puts而未执行current_user = nil,但仍然定义了局部变量,并且其值隐式设置为if false。这就是您的第二个nil显示puts的原因。即使您将nil更改为current_user = nil,您的第二个current_user = :someone仍应显示puts