【问题标题】:How to use cattr_accessor to define config in a Rails initializer如何使用 cattr_accessor 在 Rails 初始化程序中定义配置
【发布时间】:2018-03-19 15:30:42
【问题描述】:

给定以下类(这是实际的类,没有其他代码)

class PageRepo
  cattr_accessor :root_path
end 

和初始化文件

PageRepo.root_path = Rails.root.join("content")

当我跑步时 rails console

PageRepo.root_path 
=> PageRepo.root_path
=> #<Pathname:/Users/blah/my_rails_app/content/pages>

但是,当我尝试在我的 rails 控制器中访问它时,root_path 值为 nil。 (我已经使用 web_console 进行了检查。)

没有其他类的子类或者是 PageRepo 类的父类,并且在初始化阶段之后,我没有在类级别或实例级别的任何地方将 root_path 设置为 nil。我已经多次重新启动 spring 和我的服务器但无济于事。

关于 Rails 初始化程序或 cattr_accessor,有什么我不知道的吗?

更新

我想设置这样的路径,因为在我的代码中我将初始化一个 PageRepo 实例并且路径不会改变。但是,它可能会在不同的环境中发生变化。 IE。在开发中,路径将不同于测试和生产环境。虽然我可以做

def initialize @root_path = ENV['ROOT_PATH'] end

我不希望强迫程序员使用 ENV VARS 来执行此操作,因此我在上面进行了尝试。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我的解决方案就是使用class 方法

    class PageRepo
      self.root_path
         Rails.root.join("content")
      end 
    end 
    

    PageRepo.root_path 将返回 #&lt;Pathname:/Users/blah/my_rails_app/content/pages&gt;

    你想拥有#&lt;Pathname:/Users/blah/my_rails_app/content/pages&gt;?或者这取决于行动?

    我相信您的初始化程序不起作用

    一个有趣的post,你想要实现的是在class initializerconstructor 中写这样的东西

    class PageRepo
      self.initialize
         self.root_path = Rails.root.join("content")
      end 
    end 
    

    但我从未见过self.initialize 与rails 一起使用。所以我相信第一种方法更好。

    【讨论】:

    • 感谢 Fabrizio 的回复。不幸的是,我不想对路径进行硬编码。我更新了我的问题以解释我为什么以及我想要达到的目标。
    • @robodisco 你知道为什么你的解决方案不起作用吗?初始化程序代码是否在服务器启动时执行?您可以通过在初始化程序中设置断点绑定pry 来检查。这个值什么时候改变?一旦类被实例化?或者一旦需要类代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多