Domanda Dove mettere le classi personalizzate per renderle disponibili globalmente all'app Rails?


Ho una classe che sto cercando di utilizzare nel mio controller nell'azione indice.

Per semplificarlo, sembra così

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 tentato di require 'FrontPage', require 'FrontPage.rb', require 'front_page'e ognuno di quelli con il percorso anteposto, ad es 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 inserisco questo 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


23
2018-02-18 04:15


origine


risposte:


Dovresti essere in grado di usare require 'front_page' se stai piazzando front_page.rb da qualche parte nel tuo percorso di carico. I.e .: questo dovrebbero lavoro:

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

Per verificare il percorso di caricamento, prova 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...

Puoi vedere in questo esempio, la prima linea è del progetto lib directory, che è dove hai detto il tuo front_page.rb vite.

Un'altra cosa che puoi fare è aggiungerla al tuo config/application.rb:

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

Questo dovrebbe far sì che tu non abbia nemmeno bisogno del require; invece Rails lo caricherà automaticamente (e tutto il resto nel tuo lib dir, quindi fai attenzione).


24
2018-02-18 04:39



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


7
2018-02-18 04:36



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


4
2018-02-18 04:24