在哪里放置自定义类,使它们全局可用于Rails应用程序?

时间:2012-02-18 04:15:17

标签: ruby-on-rails ruby

我正在尝试在索引操作中使用我的控制器中的类。

为了简化它,它看起来像这样

class PagesController < ApplicationController
  def index
    @front_page = FrontPage.new
  end
end

FrontPage是我定义的一个类。要包含它,我将它放在/ lib /文件夹中。我尝试过require 'FrontPage'require 'FrontPage.rb'require 'front_page'以及每个路径前置的路径,例如require_relative '../../lib/FrontPage.rb'

我不断收到以下消息之一:cannot load such file -- /Users/josh/src/ruby/rails/HNReader/lib/front_page uninitialized constant PagesController::FrontPage

我在哪里放这个文件/如何将它包含在控制器中以便我可以实例化一个对象?

这是Rails 3.1.3,Ruby 1.9.2,OS X Lion

3 个答案:

答案 0 :(得分:25)

如果您将require 'front_page'置于加载路径中的某个位置,则应该可以使用front_page.rb。即:这个应该工作:

require 'front_page'
class PagesController < ApplicationController
  def index
    @front_page = FrontPage.new
  end
end

要检查您的加载路径,请尝试以下操作:

$ rails console
ree-1.8.7-2011.03 :001 > puts $:
/Users/scottwb/src/my_app/lib
/Users/scottwb/src/my_app/vendor
/Users/scottwb/src/my_app/app/controllers
/Users/scottwb/src/my_app/app/helpers
/Users/scottwb/src/my_app/app/mailers
/Users/scottwb/src/my_app/app/models
/Users/scottwb/src/my_app/app/stylesheets
# ...truncated...

您可以在此示例中看到,第一行是项目的lib目录,您说的是front_page.rb所在的目录。

您可以做的另一件事是在config/application.rb

中添加此内容
config.autoload_paths += %W(#{config.root}/lib)

这应该使你甚至不需要require;相反,Rails会自动加载它(以及lib目录中的其他所有内容,所以要小心)。

答案 1 :(得分:7)

该文件名为FrontPage.rb。将名称更改为“front_page.rb”,但将类名保留为“FrontPage”可以解决问题。

答案 2 :(得分:4)

我们只需要加载文件

class PagesController < ApplicationController
  require 'front_page.rb'
  def index
    @front_page = FrontPage.new
  end
end

LIB / front_page.rb

class FrontPage
end

我们还可以将application.rb设置为自动加载这些文件

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)

第二种选择是一种更好的解决方案。