【问题标题】:Where to put custom classes to make them globally available to Rails app?在哪里放置自定义类以使它们对 Rails 应用程序全局可用?
【发布时间】:2012-02-18 04:15:16
【问题描述】:

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

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

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

【问题讨论】:

  • 你试过require 'front_page'吗?
  • @Mischa 是的,所有这些需要参数都应该用引号引起来。感谢您指出了这一点。使用 require 会导致错误 cannot load such file -- front_page

标签: ruby-on-rails ruby


【解决方案1】:

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

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 目录中的所有其他内容,所以要小心)。

【讨论】:

  • 自动加载是关键
  • 谢谢 - 问题:在 lib 目录中自动加载 everything 是否危险或有风险?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我们只需要加载文件,

    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)
    

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

    【讨论】:

    • 是的,我试过了。我把它放在类定义之外,但现在检查一下,把它放在类定义中仍然会产生cannot load such file -- front_page.rb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2021-12-04
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多