如何在Rails 5 app

时间:2016-10-23 08:26:44

标签: ruby-on-rails ruby

如何添加' lib/'我的模型中的类或模块,Grape API和测试?例如,我有一个班级:

ROOT/lib/links/link.rb

module Links
  class Link
    ...
  end
end

我想在我的用户模型(app/models/user.rb),用户Grape API(app/api/v1/users.rb)和测试套件(test/models/user_test.rbtest/api/v1/users/users_links_test.rb)<中包含该类/ p>

例如,我尝试通过

在我的测试中访问它

link = Links::Link.new(LINK_NAME, LINK_SITE)

但我明白了:

uninitialized constant API::V1::Users::APITest::Links

我已尝试将其添加到我的config/application.rb

config.autoload_paths += Dir["#{Rails.root}/lib/**"]

require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
# require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module ArbitraryAppName
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Auto-load API and its subdirectories
    config.paths.add 'app/api', glob: '**/*.rb'
    config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
    config.autoload_paths << "#{Rails.root}/lib"

    # For Cross-Origin Resource Sharing (rack-cors)
    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end
  end
end

但它不起作用。我错过了什么?如何包含lib文件以及如何调用这些类?

编辑: 似乎我可以访问它的唯一方法就是:

require "#{Rails.root}/lib/links/link"

是否有更好,更传统的方式?

似乎还有另一个问题,添加config.autoload_paths << whatever似乎没有做任何事情。例如,当puts ActiveSupport::Dependencies.autoload_paths中的rails console时,我的更改不会显示。

3 个答案:

答案 0 :(得分:6)

不,你不应该使用require(如果你想遵循Rails约定)。 Rails自动加载基于路径和命名空间,因为这两件事必须匹配。除了修复了命名空间的初始问题之外,修改自动加载路径的方式也不正确。它应该这样做:

config.autoload_paths << "#{Rails.root}/lib"

如果您想将lib/留在项目的根目录下。如评论中所述,您可以将其移动到app/目录中。

答案 1 :(得分:0)

Paul Hoffer的答案是公认的答案,但对于那些注意到config/application.rb的任何更改都不会持续存在的人来说

Spring似乎存在一个问题,config/application.rb文件的任何更改都不会持续存在。我必须运行spring stop才能让事情重新开始。如果有人能解释为什么有时会发生这种情况,那就太好了。

答案 2 :(得分:0)

你应该lib放入autoload_paths(正如Paul Hoffer建议的那样),因为这样做会阻止它在生产中急切加载({{1}时})。

您可以在此处找到有关此主题的详尽指南:http://hakunin.com/rails3-load-paths