如何添加' 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.rb
和test/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
时,我的更改不会显示。
答案 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