2012-02-18 11 views
22

Ho una classe che sto cercando di utilizzare nel mio controller nell'azione indice.Dove mettere le classi personalizzate per renderle globalmente disponibili per l'app Rails?

Per semplificare, sembra che questo

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

FrontPage è una classe che ho definito. Per includerlo, l'ho messo nella cartella/lib /. Ho cercato di require 'FrontPage', require 'FrontPage.rb', require 'front_page', e ciascuno di questi con il percorso anteposto, ad esempio require_relative '../../lib/FrontPage.rb'

Continuo a ricevere uno dei seguenti messaggi: cannot load such file -- /Users/josh/src/ruby/rails/HNReader/lib/front_page o uninitialized constant PagesController::FrontPage

Dove metto il file/come lo includo in un controller in modo da poter creare un'istanza di un oggetto?

Questo è Rails 3.1.3, Ruby 1.9.2, OS X Lion

+3

Hai provato a richiedere 'front_page''? – Mischa

+0

@Mischa Sì, tutti quelli che richiedono argomenti devono essere racchiusi tra virgolette. Grazie per la segnalazione. Usando quel risultato 'require' nell'errore' impossibile caricare tale file - front_page' –

risposta

4

Abbiamo solo bisogno di caricare il file,

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

lib/front_page.rb

class FrontPage 
end 

Possiamo anche impostare il application.rb su autoload questi file

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

La seconda opzione sarebbe una soluzione preferibile.

+0

Sì, l'ho provato. L'ho messo fuori dalla definizione della classe, ma controllando ora, inserendolo nella definizione della classe si ottiene ancora 'impossibile caricare tale file - front_page.rb' –

7

Il file è stato chiamato FrontPage.rb. Cambiando il nome in "front_page.rb", ma lasciando il nome della classe come "FrontPage" ha risolto il problema.

+3

La convenzione non è specifica di Java. http://en.wikipedia.org/wiki/CamelCase – 0112

23

Dovresti essere in grado di utilizzare require 'front_page' se stai posizionando front_page.rb da qualche parte nel percorso di caricamento. Vale a dire: questo dovrebbe lavoro:

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

per controllare il vostro percorso di carico, provate questo:

$ 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... 

Si può vedere in questo esempio, la prima riga è lib directory del progetto, che è dove hai detto che le tue vite front_page.rb.

Un'altra cosa che puoi fare è aggiungere questo nel vostro config/application.rb:

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

Questo dovrebbe fare in modo che non hanno nemmeno bisogno di require; invece Rails lo ricaricherà automaticamente (e tutto il resto nella tua dir lib, quindi fai attenzione).

+0

autoloading è la chiave – Donato

+0

grazie - domanda: è pericoloso o rischioso caricare automaticamente * tutto * nella directory lib? – BKSpurgeon

Problemi correlati