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

Jos*_*ark 23 ruby ruby-on-rails

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

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

class PagesController < ApplicationController
  def index
    @front_page = FrontPage.new
  end
end
Run Code Online (Sandbox Code Playgroud)

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

sco*_*twb 26

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

require 'front_page'
class PagesController < ApplicationController
  def index
    @front_page = FrontPage.new
  end
end
Run Code Online (Sandbox Code Playgroud)

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

$ 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...
Run Code Online (Sandbox Code Playgroud)

您可以在此示例中看到,第一行是项目的lib目录,这是您说出front_page.rb生活的地方.

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

config.autoload_paths += %W(#{config.root}/lib)
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*ark 7

该文件已命名FrontPage.rb.将名称更改为"front_page.rb",但将类名保留为"FrontPage"解决了该问题.

  • 该约定不是Java特定的.http://en.wikipedia.org/wiki/CamelCase (3认同)

nkm*_*nkm 5

我们只需要加载文件,

class PagesController < ApplicationController
  require 'front_page.rb'
  def index
    @front_page = FrontPage.new
  end
end
Run Code Online (Sandbox Code Playgroud)

库/front_page.rb

class FrontPage
end
Run Code Online (Sandbox Code Playgroud)

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

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

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