- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有这个应用程序,它使用 Devise 和 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 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 >
这在底层是如何工作的?
最佳答案
current_user
是 Devise 提供的辅助方法,不是局部变量。
没有名为 current_user=
的辅助方法。您可以通过将 current_user = nil
更改为 self.current_user = nil
并看到它崩溃来证明这一点。但这与您的问题无关。
结果是,您在 2 个 puts
之间定义了一个局部变量 current_user
,它隐藏了同名的辅助方法。
奇怪的是,尽管 current_user = nil
因为 if false
没有被执行,局部变量仍然被定义,并且它的值被隐式设置为 无
。这就是为什么您的第二个 puts
显示 nil
的原因。即使您将 current_user = nil
更改为 current_user = :someone
,您的第二个 puts
仍应显示 nil
。
关于ruby-on-rails - Rails ActiveSupport::关注点和方法评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47587079/
当我尝试执行 rails server 和 thin start 时,两者都说:“在任何来源中都找不到 activesupport-3.0.6。” 我安装了 activesupport-3.0.7。我
在迁移到 rails 5 之前,它运行良好,但是当我迁移到 rails 5.1.1 时,它给我这样的错误 ActiveSupport::MessageVerifier::InvalidSignatur
在尝试启动某个开源 Rails 项目的旧版本时,遇到了一条多云的错误消息: “无法激活 activesupport (>= 2.3.2, runtime),已经激活 activesupport-2.1
我在将我的 React on Rails 应用程序部署到 Heroku 时遇到了一些麻烦。我已经阅读并尝试了无数关于如何解决 secret_key_base 和 rails_master_key 问题
我已将 Ruby on Rails 应用程序从 Rails 5.1.2 迁移到 Rails 5.2.0 以使用加密的 secret 。应用程序已成功部署到 Digital Ocean Ubuntu 服
我已将 Ruby on Rails 应用程序从 Rails 5.1.2 迁移到 Rails 5.2.0 以使用加密的 secret 。应用程序已成功部署到 Digital Ocean Ubuntu 服
我找到了 ActiveSupport 变形器类。在哪里可以找到初始化英文变形器的代码? 最佳答案 ActiveSupport inflector.rb文件包含所有词形变化库和模块。 如果您想自定义它,
我正在使用带有 rails 3 的 mongoid 并且最近遇到了一个非常艰难的问题 问题,我需要一个建议。 我正在开发 CMS,其中一个想法是 CMS 将提供 一些基本模型定义和最终用户将在需要时扩
我在纽约有我的 Linux 服务器,配置为 GMT。 我所有的日期都以 UTC 格式保存。 要将这些日期返回给客户,我唯一需要做的是 ? date = my_date.utc_to_local 不管我
我有一个令人尴尬的基本问题: 我正在研究一个处理金钱的普通老式 ruby 模型,一些类方法返回需要格式化才能显示的价格。 过去我曾使用 include ActionView::Helpers::N
我遇到了一个小问题...我正要在 Exercism.io 上开始一些卡塔练习当我运行测试时,我有一个 Gem:ConflictError /Users/john/.rbenv/versions/2.4
我有一个这样的日期对象: >> the_date => Tue, 12 Jun 2012 >> the_date.class => Date 和一个存储为字符串的时区: >> tz = "Pacifi
我已经从 Rails 应用程序中提取了一个类到 a gem 中.它非常非常简单,但我当然想对其进行全面测试(我使用的是 rspec)。 该类进行一些简单的日期计算。它不依赖于 Rails,但由于它是在
我很高兴也很惊讶地发现 ActiveSupport 以我想要的方式计算月数。无论所讨论的月份有多少天,添加 1.month到特定的 Time将使您与 Time 在同一天. > Time.utc(201
我有一个非常简单的设置来测试 rails3 ActiveSupport::Notifications。通过阅读文档,ActiveSupport::Notifications.subscribe 位应该
是否可以在类方法上使用 ActiveSupport::Callbacks?更具体地说,在下面的模块中,您会将 include ActiveSupport::Callbacks 放在哪里,以使 defi
我想在我的一个模型上使用 ActiveSupport 选项 encode_big_decimal_as_string。我应该把它放在模型中吗?我是否在模型实例上调用此方法?我要把它放在配置中的某个地方
我正在研究 CodeSchool 的 RubyBits,我做了一个我只是不理解的练习:“确保 AtariLibrary 类只包含 LibraryUtils 模块,并让 ActiveSupport::C
我在 Rails 3 应用程序中收到 SystemStackError。 我拥有的所有信息都是无用的一行堆栈跟踪(从日志中获取): SystemStackError (stack level too
我知道 include 用于将模块方法作为实例方法访问,而 extend 用于将模块方法作为类方法访问。 对于 ActiveSupport::Concern 某处我看到写成, module Test
我是一名优秀的程序员,十分优秀!