【问题标题】:Creating models from lib directory in Rails 4在 Rails 4 中从 lib 目录创建模型
【发布时间】:2014-10-23 16:15:01
【问题描述】:

我有一个文件 lib/stock_reader.rb 我试图在其中创建一个像这样的模型:

module StockReader
  def self.create_company_reports(company_data)
    CompanyReport.create(name: company[:name])
  end
end

在另一个文件 lib/curate.rb 中,我调用了这个方法:

require_relative 'stock_reader'

StockReader.create_company_reports(company_data)

但我收到错误:

/Users/me/code/applications/curator/lib/stock_reader.rb:38:in `block in create_company_reports': uninitialized constant StockReader::CompanyReport (NameError)
from /Users/me/code/applications/curator/lib/stock_reader.rb:37:in `each'
from /Users/me/code/applications/curator/lib/stock_reader.rb:37:in `create_company_reports'
from lib/curate.rb:12:in `<main>'

似乎我的 lib 目录无法识别我的模型在 app/models/company_report.rb 中的存在:

class CompanyReport < ActiveRecord::Base
end

我猜这可能是因为 lib/ 目录是在 app/models 之前加载的,但我不确定。

我查看了Accessing models from within the lib directory in a Rails 3 project,但看不到任何 rakefile 中需要我的 lib/ 目录的位置。

【问题讨论】:

  • 您打算什么时候运行CompanyReport.create 行?
  • @Jordan 我在 lib/ 中有另一个文件,我在其中调用包含 CompanyReport.create 的 StockReader 方法。我使用 require_relative 'stock_reader' 在该文件中包含 StockReader 模块
  • 您还没有在 StockReader 中定义任何方法...
  • @Jordan 为了简洁起见,我省略了这些方法
  • 那很好,除了您发布的代码与其中包含方法的模块具有完全不同的语义,并且没有告诉我们我们需要了解您所处的上下文试图访问CompanyReport。请发布您的实际代码。

标签: ruby-on-rails activerecord ruby-on-rails-4


【解决方案1】:

当我通过运行 $ ruby lib/curate.rb 测试 lib/curate.rb 时会发生这种情况

嗯,这就解释了。

Ruby 对 CompanyReport 一无所知。 Rails 知道在哪里可以找到您的模型,因为它有大量处理自动加载类的代码,但 Ruby 不是 Rails。如果你想让代码使用 Rails 的特性,你需要在“Rails 环境”中运行代码。

有几种方法可以做到这一点。如果你想在 Rails 环境中运行任意脚本(如lib/curate.rb),可以使用rails runner 命令:

$ bin/rails runner lib/curate.rb

Rails 控制台对于测试也非常有用:

$ bin/rails console
Loading development environment (Rails 4.1.6)
irb(main):001:0> require Rails.root + "lib/curate"

在 Rails 项目中很少使用ruby 命令,因为通常您想使用 Rails 的功能。您可能会更频繁地使用上述命令。

【讨论】:

  • 这很好用——不知道rails runner。当你问“这是什么时候发生的?”时,我意识到我是多么愚蠢。但是很酷地看到您可以使用 runner 加载环境。非常感谢乔丹。如果我有代表会投票 :)
【解决方案2】:

问题是CompanyReport 类在它正在寻找它的StockReader 模块中不存在。要使用顶级 CompanyReport 模型,请在类名前加上 ::

::CompanyReport.create(name: company[:name])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多