【问题标题】:Dynamic constant definition in RailsRails 中的动态常量定义
【发布时间】:2011-05-14 10:37:22
【问题描述】:

我正在使用以下语法在 Rails 的初始化程序中定义一个常量:

MyModule.const_set('MYCONSTANT','foobar')

如果我启动控制台并编写它,它会起作用

MyModule::MYCONSTANT 

我按预期收到了 foobar。

问题是,当我尝试在模型中调用它时,常量不存在。

D 应该在哪里动态定义我的常量,它也可以在我的模型中使用?

如果我在 lib/mymodule.rb 中静态定义它,它可以工作,但我想在运行时定义一些常量。

【问题讨论】:

  • 您打错了:MY_CONSTANT 与 MYCONSTANT。这只是问题中的错误,还是您的代码中的问题?
  • 问题中的错字,谢谢!

标签: ruby-on-rails ruby metaprogramming


【解决方案1】:

如果你想保留config.cache_classes = false, 你可以放

MyModule.const_set('MYCONSTANT','foobar')

进入 application.rb 中的以下块:

config.to_prepare do
MyModule.const_set('MYCONSTANT','foobar')
end

【讨论】:

    【解决方案2】:

    也许在开发模式下自动加载是问题?

    您的模型类会为每个请求重新创建,因此您需要一次又一次地创建常量。

    问题会在生产模式下消失。您可以在开发模式下关闭自动加载,但这将强制您在每次更改代码后重新启动服务器。

    请参阅 config/environments/development.rb:config.cache_classes = false(更改为 true)。

    【讨论】:

      【解决方案3】:

      我在尝试做“动态常量”时偶然发现了这一点。

      我的目标是能够将特定的数据库条目用作常量。 (一旦插入,该行在特定实例上永远不会改变,但不同实例上的 id 可能不同)。

      我想出了一个适用于这种情况的解决方案,具体取决于您尝试使用动态常量的原因。这是我用例中的一个示例,但是用其他东西替换属性定义相当容易。

      class MyModel < ActiveRecord::Base
        def self.MY_CONST
          @my_const ||= MyModel.find_by(code: 'my_const_code')
        end
      end
      

      这是我测试它的方法:

      require 'test_helper'
      
      class MyModelTest < ActiveSupport::TestCase
        test "mymodel constant defined" do
          assert_equal MyModel.find_by(code: 'my_const_code'), MyModel.MY_CONST
        end
      end
      

      【讨论】:

      • 这不是一个常量,它是一个带有大写名称的方法
      • 确实如此。正如我在消息中所解释的,这是一种替代解决方案,可以满足需要动态常量的需求。
      猜你喜欢
      • 2020-03-13
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多