2009-08-12 7 views
11

Lo extraño - Tengo el módulo de autenticación en lib/ así:rieles: métodos de módulo incluido en el controlador no está disponible en vista

module Authentication 
    protected 

    def current_user 
    User.find(1) 
    end 

end 

y en ApplicationController estoy incluyendo este módulo y todos los ayudantes, pero current_user método está disponible en los controladores, pero no desde puntos de vista :(¿Cómo puedo hacer este trabajo?

+0

UPD: rails versión 2.3.3 –

+0

Ah, sí, por último, parece que sería ventajoso crear esto como un complemento en lugar de un archivo suelto en/lib. – kch

+0

¿Cuál es el punto de 'return a menos que m Liquiddots

Respuesta

30

Si el método se define directamente en el controlador, que tendría que ponerla a disposición de vistas llamando helper_method :method_name.

class ApplicationController < ActionController::Base 

    def current_user 
    # ... 
    end 

    helper_method :current_user 
end 

Con un módulo, puede hacer lo mismo, pero es un poco más complicado.

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, sí, si el módulo está destinado a ser estrictamente un módulo de ayuda, que puede hacer como Lichtamberg dijo. Pero, de nuevo, puede llamarlo AuthenticationHelper y ponerlo en la carpeta app/helpers.

Aunque, según mi propia experiencia con el código de autenticación, será y quiero que esté disponible tanto para el controlador como para las vistas. Porque generalmente manejarás la autorización en el controlador. Los ayudantes están exclusivamente disponibles para la vista. (Creo que originalmente estaban pensados ​​como abreviaciones para construcciones html complejas).

+1

Tengo el método undefined 'helper_method 'para # en m.helper_method: current_user: ((( –

+0

) Es extraño, probé el código anterior. Debe incluir Autenticación en otras cosas que no sean controladores. En ese caso, solo agregue una condición a esa línea: si m kch

+0

actualicé el ejemplo para manejar la situación donde el módulo está incluido en cosas que no son controladores. – kch

1

Quizás quiso declarar con

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

en ti r ApplicationController?

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

+0

ya tengo en el controlador de la aplicación ayudante: todos ¿no es suficiente? –

+1

helper: todos solo cargarán helpers en el directorio de aplicaciones/ayudantes (y en los complementos del motor), y creo que solo se nombran something_helper.rb/SomethingHelper. – kch

+0

¿eh, pero qué hay de cargar un módulo de lib/??? –

Cuestiones relacionadas