2012-02-18 20 views
22

我有一個類,我試圖在我的控制器中使用索引操作。在哪裏把自定義類,使他們全球可用的Rails應用程序?

爲了簡化它,它看起來像這樣

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,1.9.2紅寶石,OS X Lion的

+3

您是否試過'require'front_page''? – Mischa 2012-02-18 04:18:47

+0

@Mischa是的,所有這些需要參數都應該用引號括起來。感謝您指出了這一點。使用'require'導致錯誤'不能加載這樣的文件 - front_page' – 2012-02-18 04:20:34

回答

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) 

第二個選項將是一個更好的解決方案。

+0

是的,我試過了。我把它放在類定義之外,但是現在檢查,把它放到類定義中仍然會產生'無法加載這樣的文件 - front_page。rb' – 2012-02-18 04:28:53

7

該文件被命名爲FrontPage.rb。將名稱更改爲'front_page.rb',但將類名稱改爲'FrontPage'即可解決問題。

+3

該約定不是Java特定的。 http://en.wikipedia.org/wiki/CamelCase – 0112 2014-09-11 16:50:39

23

如果您要將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目錄中,所以要小心)。

+0

自動加載是關鍵 – Donato 2015-04-10 19:36:15

+0

謝謝你 - 問題:自動加載* lib目錄中的所有*是危險還是冒險? – BKSpurgeon 2016-08-25 21:46:25

相關問題