2009-08-12 4 views
11

Chose étrange - Je le module d'authentification dans lib/ comme ceci:rails: méthodes de module inclus dans le contrôleur non disponible en vue

module Authentication 
    protected 

    def current_user 
    User.find(1) 
    end 

end 

et ApplicationController je compris ce module et tous les assistants, mais la méthode current_user est disponible dans les contrôleurs, mais pas de vues :(Comment puis-je faire ce travail?

+0

UPD: rails version 2.3.3 –

+0

Ah oui, enfin, il semble qu'il serait avantageux pour vous de créer ceci comme un plugin au lieu de fichier lâche dans/lib. – kch

+0

Quel est le point de 'return sauf m Liquiddots

Répondre

30

Si la méthode ont été définis directement dans le contrôleur, vous auriez à le rendre disponible à des vues en appelant helper_method :method_name.

class ApplicationController < ActionController::Base 

    def current_user 
    # ... 
    end 

    helper_method :current_user 
end 

Avec un module, vous pouvez faire la même chose, mais c'est un peu plus compliqué.

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, oui, si votre module est censé être strictement un module d'aide, vous pouvez le faire comme dit Lichtamberg. Mais encore une fois, vous pouvez simplement le nommer AuthenticationHelper et le mettre dans le dossier app/helpers.

Bien que, par ma propre expérience avec le code d'authentification, va voulez qu'il soit disponible pour le contrôleur et les vues. Parce que généralement vous allez gérer l'autorisation dans le contrôleur. Les assistants sont exclusivement disponibles pour la vue. (Je crois qu'ils ont été initialement conçus comme des raccourcis pour les constructions html complexes.)

+1

J'ai la méthode non définie 'helper_method 'pour # sur m.helper_method: current_user: ((( –

+0

C'est étrange, j'ai testé le code ci-dessus Vous devez inclure l'authentification dans les choses autres que les contrôleurs. Dans ce cas, ajoutez simplement une condition à cette ligne: si m kch

+0

J'ai mis à jour l'exemple pour gérer la situation où le module est inclus dans les choses qui ne sont pas des contrôleurs – kch

1

Avez-vous déclarer avec

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

en vous r ApplicationController?

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

+0

j'ai déjà dans l'application contrôleur : tout n'est-il pas assez? –

+1

helper: tous ne chargeront que des helpers dans le répertoire app/helpers (et dans les plugins moteur), et je pense, seulement s'ils sont nommés something_helper.rb/SomethingHelper. – kch

+0

hein, mais qu'en est-il de charger un module de lib/??? –

Questions connexes