2016-07-29 37 views
2

vor der Anwendung der BeforeOrAfter-Modul in meiner Ansicht, versuchen, es in der Konsole zu arbeiten. Erhalten der NoMethodError: undefined method BEFORE_OR_AFTER‘für #` Fehler:Modul nicht geladen in der Steuerung (undefined_method Fehler)

> s = Artist.find(1) 
> s.events.each do |event| 
>  before_or_after(event.date) 
> end 

Ich wählte einen neuen Module Unterverzeichnis, app/modules/before_or_after.rb zu erstellen:

module BeforeOrAfter 
    attr_reader :past 
    attr_reader :future 

    require "date" 
    def initialize 
    @datetime = DateTime.new 
    @future = [] 
    @past = [] 
    end 

    def before_or_after(datetime) 
    if datetime < DateTime.now 
     @past << datetime 
    else 
     @future << datetime 
    end 
    end 
end 

einschließlich es in application_controller.rb weil alle meine Controller wird es werden:

class ApplicationController < ActionController::Base 
    include BeforeOrAfter 

Antwort

0

in Ihrer Rails-Anwendung ausführen zu können, fügen Sie bitte die folgende Zeile in config/application.rb,

config.autoload_paths << Rails.root.join('app/modules') 

in der Konsole ausführen zu können, umfassen das Modul zunächst wie,

include BeforeOrAfter 
+0

Server wird nicht gestartet, da die Konfiguration nicht definiert ist. Sollte diese Linie in eine Art Block geraten? – sivanes

+0

Ja, es muss innerhalb der Klasse Application

1

ich glaube nicht, dass die Schienen-Umgebung eifrig vor dem Ausführen der Konsole geladen ist. Wenn Sie in der Konsole sind, stellen Sie sicher, dass Sie diese Datei require vor der Verwendung dieser Methode.

Wenn Sie die vollständige Rails-App ausführen, sollte Ihre Datei automatisch geladen werden. Sie können mehr über das automatische Laden und die Notwendigkeit für erfordert here lesen.

+0

'require„BEFORE_OR_AFTER "' führt zu LoadError, keine solche Datei. Ich weiß, dass ich es auf die weniger konventionelle Weise mache, Module/Unterverzeichnis zu erstellen, anstatt das Modul in lib/zu stecken, könnte das das Problem sein? Ich starte meinen Dev-Server, starte ihn mehrmals neu. – sivanes

+0

Die einzige Zeit, in der Sie Module nur nach dem Namen benötigen können, ist, wenn sich das Verzeichnis, das die Datei enthält, im Array $ LOAD_PATH befindet. Sie müssen die Datei mit dem relativen Pfad vom aktuellen Arbeitsverzeichnis anfordern. – arjabbar

+0

Und Sie sollten auch der Konvention folgen, indem Sie diese Datei in Ihr lib-Verzeichnis stellen. – arjabbar