2009-08-12 5 views
11

Merkwürdig enthalten - ich Authentifizierungsmodul in lib/ wie diese:Schienen: Methoden aus dem Modul in der Steuerung nicht in Sicht

module Authentication 
    protected 

    def current_user 
    User.find(1) 
    end 

end 

und in Application mich auch dieses Modul und alle Helfer, aber Methode current_user in-Controller verfügbar ist, aber nicht von Ansichten :(Wie kann ich diese Arbeit machen?

+0

UPD: Rails Version 2.3.3 –

+0

Ah ja, endlich klingt, als wäre es vorteilhaft für Sie, dies als ein Plugin statt lose Datei zu erstellen in/lib. – kch

+0

Was ist der Sinn von 'return es sei denn m Liquiddots

Antwort

30

Wenn die Methode direkt in der Steuerung definiert wurden, würden Sie es Ansichten zur Verfügung stellen müssen helper_method :method_name durch den Aufruf.

class ApplicationController < ActionController::Base 

    def current_user 
    # ... 
    end 

    helper_method :current_user 
end 

Mit einem Modul können Sie das gleiche tun, aber es ist ein bisschen komplizierter.

module Authentication 
    def current_user 
    # ... 
    end 

    def self.included m 
    return unless m < ActionController::Base 
    m.helper_method :current_user # , :any_other_helper_methods 
    end 
end 

class ApplicationController < ActionController::Base 
    include Authentication 
end 

Ah, ja, wenn Ihr Modul unbedingt ein Helfer-Moduls zu verstehen ist, Sie als Lichtamberg tun kann gesagt. Aber dann könnten Sie es einfach AuthenticationHelper nennen und in den Ordner app/helpers legen.

Obwohl, nach meiner eigenen Erfahrung mit Authentifizierungscode, Sie werden wollen, dass es für die Steuerung und Ansichten verfügbar sein. Weil Sie normalerweise Autorisierung im Controller behandeln. Helfer sind ausschließlich für die Ansicht verfügbar. (Ich glaube, dass sie ursprünglich als Shorthands für komplexe HTML-Konstrukte gedacht sind.)

+1

Ich habe undefinierte Methode 'helper_method 'für # auf m.helper_method: current_user: ((( –

+0

) Das ist komisch. Ich habe den Code oben getestet. Sie müssen Authentifizierung in anderen Dingen als Controller enthalten. In diesem Fall füge einfach eine Bedingung an diese Zeile an: if m kch

+0

Ich habe das Beispiel aktualisiert, um die Situation zu behandeln, in der das Modul in Dingen enthalten ist, die keine Controller sind .. – kch

1

Haben Sie es mit

helper :foo    # => requires 'foo_helper' and includes FooHelper 
    helper 'resources/foo' # => requires 'resources/foo_helper' and includes Resources::FooHelper 

in Sie erklären r ApplicationController?

http://railsapi.com/doc/rails-v2.3.3.1/classes/ActionController/Helpers/ClassMethods.html#M001904

+0

Ich habe bereits in der App Controller Helfer: alle ist es nicht genug? –

+1

helper: Alle werden nur Helfer in der app/helpers dir (und in Engine-Plugins) laden, und ich denke nur, wenn sie something_helper.rb/SomethingHelper heißen. – kch

+0

huh, aber was ist mit dem Laden eines Moduls von lib/??? –

Verwandte Themen