2017-04-14 4 views
0

Ich befolge die Schienenführungen für erweiterte Einschränkungen Advanced Constraints. Hier ist der Code:Wo soll ich eine Einschränkung für routes.rb definieren?

class BlacklistConstraint 
    def initialize 
    @ips = Blacklist.retrieve_ips 
    end 

    def matches?(request) 
    @ips.include?(request.remote_ip) 
    end 
end 

Rails.application.routes.draw do 
    get '*path', to: 'blacklist#index', 
    constraints: BlacklistConstraint.new 
end 

Die Führungen unerwähnt bleiben, wo die BlacklistConstraint soll definiert werden, oder ob es folgt Benennungskonventionen. Ich habe versucht, diesem Beispiel für meine eigene Verwendung zu folgen, aber ich bekomme immer ein UninitialiezedConstantError: Can someone help me out? So far I;ve defined my constraint class in the 1 routes.rb file itself and in the lib 'Verzeichnis. Beide Methoden haben nicht funktioniert.

Antwort

1

Ein erwarteter Platz für diese Klasse wäre lib/constraints.

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-constraints-label-Dynamic+request+matching

Update: auf die hilfreichen Kommentare Basierend, werde ich versuchen, dies eine vollständige Antwort zu machen.

Nach der docs Ihrer Constraint-Klasse sollte unter lib/constraints platziert werden, aber da das lib Verzeichnis nicht eifrig durch Schienen geladen ist, können Sie sie aktivieren, indem Sie diese Zeile hinzufügen zu config/application.rb

config.eager_load_paths << Rails.root.join('lib') 

Schienen Jetzt wird versuchen, laden Sie die Datei lib/constraints/blacklist_constraint.rb und würde erwarten, dass es richtig Namensraum werden, so wickelt diese Klasse in einem Modul (das macht es auch sauberer, weil Sie in Zukunft mehr Einschränkungen haben könnten)

module Constraints 
    class BlacklistConstraint 
    def initialize 
     @ips = Blacklist.retrieve_ips 
    end 

    def matches?(request) 
     @ips.include?(request.remote_ip) 
    end 
    end 
end 

und Referenz in routes.rb.

+0

Danke für die Hilfe, aber aus irgendeinem Grund funktionierte das nicht für mich. Ich musste den Dateipfad in meiner 'application.rb' anfordern. –

+1

Sie müssen die Autoloader-/E-Mail-Ladedateien aus dem 'lib'-Ordner aktivieren. http://blog.bigbinary.com/2016/08/29/rails-5-disables-autoloading-after-booting-the-app-in-production.html – Iceman

Verwandte Themen