【问题标题】:Rails ActiveSupport::Concern and method evaluationRails ActiveSupport::关注和方法评估
【发布时间】:2017-12-01 05:19:41
【问题描述】:

我有这个应用程序,它使用带有current_user 助手的设计。当我创建一个模块时,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 falsecurrent_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 >

这在下面是如何工作的?

【问题讨论】:

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


    【解决方案1】:
    1. current_user 是 Devise 提供的辅助方法,不是局部变量。

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

    所以结果是,您在两个puts 之间定义了一个局部变量current_user,它隐藏了同名的辅助方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多