【问题标题】:Cannot access models from /lib in Rails无法从 Rails 中的 /lib 访问模型
【发布时间】:2014-10-30 17:39:53
【问题描述】:

我编写了一个脚本来尝试一些功能。但我不能在 lib 中使用模型。有趣的是,我已经有一个库,并且它可以与大部分相同的代码一起正常工作(?)。

// script/tags.rb:
require File.expand_path('../../config/application',  __FILE__)
require 'company_tags'

host = ARGV[0] || 'team1.crm.tld'

c = CompanyTags.new(host)
c.run

// lib/company_tags.rb
class CompanyTags 
  def initialize(host)
    @site = Site.where(host: host).first
  end

  def run
    comp = @site.companies.first
    comp.tag_list.add("tag1")
    comp.general_list.add("tag_general")
    comp.save!
    p comp.tag_list
  end
end

错误:/lib/company_tags.rb:3:in `initialize': uninitialized constant CompanyTags::Site (NameError)

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller


    【解决方案1】:

    您需要的是环境,而不是应用程序。

    require File.expand_path('../../config/environment',  __FILE__)
    require 'company_tags'
    

    环境将加载所有依赖项,包括应用程序,并将引导应用程序。

    【讨论】:

    • 哇。谢谢,效果很好。但是,你可以解释一下,为什么相同的代码适用于另一对脚本+lib?我在那里使用了应用程序。
    • 它可能起作用了,因为它是以不同的方式加载的,例如通过控制台。或者因为您没有使用环境中定义的模型。
    【解决方案2】:

    只是一个想法,但请尝试将 Site.where(host: host).first 更改为 ::Site.where(host: host).first。将 :: 放在前面,会导致 ruby​​ 在全局命名空间中查找 Site,而不是在 CompanyTags 中定义的常量。

    【讨论】:

    • 哦,对不起,错误很少:in `initialize': uninitialized constant Site (NameError)
    • 好的,很酷 - 至少排除了它是一个持续查找问题。
    【解决方案3】:

    可以给config/application.rb添加一个简单的配置:

    # Autoload lib/ folder including all subdirectories
    config.autoload_paths += Dir["#{config.root}/lib/**/"]
    

    查看此question 了解更多详情。

    【讨论】:

    • 我认为你不对,因为我是从控制台运行的。
    • 实际上rails consolerails c 命令会加载您的所有应用程序文件,包括gem。
    • 嗯。我是说终端。我只是运行一个脚本,如下所示:ruby script/tags.rb。但无论如何,我会试试看。
    【解决方案4】:

    在我之前的回答中,我以为您正在运行 rails 控制台。您的主要问题是不需要 Site 类。以下是类中要求文件的工作方式。

    通过require_all函数

    require_all(MY_CLASSES_DIRECTORY)

    或者通过手动要求每个类:

    需要'Class_NAME.rb'

    请注意,Site 类在任何地方都不需要。

    更多详情,请查看link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多