在Rails 4中从lib目录创建模型

时间:2014-10-23 16:15:01

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

我有一个文件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 /目录所在的位置。

2 个答案:

答案 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])