我有一个文件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
我猜这可能是因为在app / models之前加载了lib /目录,但我不确定。
我看过Accessing models from within the lib directory in a Rails 3 project,但我无法在任何rake文件中看到我的lib /目录所在的位置。
答案 0 :(得分:3)
当我通过运行
测试lib/curate.rb
$ ruby 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的功能。您可能会经常使用上述命令。
答案 1 :(得分:0)
问题是CompanyReport
模块中找不到StockReader
类。要使用顶级CompanyReport
模型,请在类名称前添加::
::CompanyReport.create(name: company[:name])