Ruby on rails 在哪里放置自定义类以使它们在Rails应用程序中全局可用?

Ruby on rails 在哪里放置自定义类以使它们在Rails应用程序中全局可用?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个类,我正试图在索引操作的控制器中使用它 为了简化它,它看起来是这样的 class PagesController < ApplicationController def index @front_page = FrontPage.new end end class PagesController

我有一个类,我正试图在索引操作的控制器中使用它

为了简化它,它看起来是这样的

class PagesController < ApplicationController
  def index
    @front_page = FrontPage.new
  end
end
class PagesController
FrontPage
是我定义的一个类。为了包含它,我将它放在/lib/文件夹中。我尝试了
要求“FrontPage”
要求“FrontPage.rb”
要求“FrontPage”
,以及前面有路径的每一个,例如
要求相对“../../lib/FrontPage.rb”

我一直收到以下消息之一:
无法加载这样的文件--/Users/josh/src/ruby/rails/HNReader/lib/front\u page

未初始化的常量页面控制器::FrontPage

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


这是Rails 3.1.3、Ruby 1.9.2、OS X Lion

我们只需要加载文件

class PagesController < ApplicationController
  require 'front_page.rb'
  def index
    @front_page = FrontPage.new
  end
end
我们还可以将
application.rb
设置为自动加载这些文件

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

第二个选项是更好的解决方案。

文件名为
FrontPage.rb
。将名称更改为“FrontPage.rb”,但将类名保留为“FrontPage”解决了此问题。

如果将
FrontPage.rb
放置在加载路径的某个位置,则应该能够使用
要求“FrontPage”
。即:这应该可以:

在本例中,您可以看到,第一行是项目的
lib
目录,这就是您所说的
首页.rb
所在的位置

您可以做的另一件事是将其添加到
config/application.rb中:

config.autoload_paths += %W(#{config.root}/lib)

这样,您甚至不需要
require
;相反,Rails将自动加载它(以及
lib
dir中的所有其他内容,所以要小心)。

您是否尝试过
要求“首页”
?@misha是的,所有这些require参数都应该用引号括起来。谢谢你指出这一点。使用
require
会导致错误
无法加载这样的文件--首页
是的,我已经尝试过了。我把它放在类定义之外,但是现在检查一下,把它放在类定义之内仍然会产生
无法加载这样的文件--首页.rb
自动加载是关键谢谢你-问题:自动加载lib目录中的所有内容是危险的还是有风险的?
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...
config.autoload_paths += %W(#{config.root}/lib)