Problema helpers :all

Veamos, tengo el siguiente código en mi ApplicationHelper:

def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end

En mi ApplicationController tengo el siguiente:

helper :all

Pues bien en otro controlador, el UserSessionsController, tengo esta
acción:

def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = “Login successful!”
redirect_back_or_default new_user_session_path
else
render :action => :new
end
end

Pues bien, no sé por qué motivo pero Rails (2.3.2) me lanza este error:

NoMethodError in User sessionsController#create

undefined method `redirect_back_or_default’ for
#UserSessionsController:0xb6f560ac

¿Estoy haciendo algo mal? Tengo entendido que habiendo incluido todos
los helpers en mi ApplicationController, todos mis controladores
deberían de tener disponibles ese método, ¿No?

Gracias por adelantado :).

P.D.: Estoy usando Authlogic.

2009/4/2 Carlos Belizón [email protected]

end
end

Los helpers son para las vistas. Esto es. Solo están disponibles en las
vistas.
El primer método lo debes de meter como método privado del application
Controller.

Si se recicla código de controladores a vistas, has de hacer un módulo
en
lib he incluirlo en los helpers necesarios así como en los controladores
en
los que necesites esa funcionalidad.

Guillermo wrote:

2009/4/2 Carlos Belizón [email protected]
los que necesites esa funcionalidad.

Vale, creo que te he entendido, muchas gracias :).

¿Estoy haciendo algo mal? Tengo entendido que habiendo incluido todos
los helpers en mi ApplicationController, todos mis controladores
deberían de tener disponibles ese método, ¿No?

un error muy común :slight_smile:

en realidad si hubieras incluído el helper, sí estaría disponible.
Pero es que no lo estás incluyendo.

los helpers son métodos que se llaman desde las Vistas. Como sabes, el
patrón MVC precisamente hace especial énfasis en la separación de las
diferentes capas, sin que haya más comunicación/acoplamiento entre ellas
que el proporcionado por el propio framework.

siguiendo ese razonamiento, si los helpers están accesibles desde las
vistas, es porque pertenecen a la capa de presentación, y no a la capa
de control.

Rails automágicamente hace que, por convención, en una vista determinada
estén disponibles los helpers genéricos del framework más todos los
métodos helper de ApplicationHelper, más aquellos que hayas definido en
un fichero que se llame igual que el controlador.

A veces, te interesa crearte más ficheros de helpers genéricos, por
limpieza. En ese caso, lo que haces es en el controlador decirle

helper tuhelper

Para indicarle que cuando la acción vaya a pasar el control a la vista,
le deje disponibles adicionalmente los métodos de ese helper.

helper :all

simplemente le dice que todas las vistas tengan acceso a todos los
métodos de todos los helpers (en ese caso has de ser cuidadoso con que
dos helper diferentes no usen el mismo nombre para dos métodos, o
tendrás efectos colaterales poco agradables).

¿Cómo hago para llamar un método helper desde el controlador entonces?

no lo hago

Los helper son métodos que pertenecen a la capa de presentación, así que
no deben ser usados por la capa de control.

En algunos casos, si defines un método genérico que no es estrictamente
de presentación, puedes estar tentado a usarlo en el controlador. En
esos casos es posible (el lenguaje lo permite) hacer un include del
helper en el controller. Al hacer el include estás haciendo que los
métodos estén disponibles. Pero el que sea posible, no significa que sea
lo más limpio.

Para el caso concreto de que tienes un método que te interesa llamar
tanto desde la capa de control como desde la capa de presentación, Rails
proporciona un mecanismo. Defines tu método a nivel de controlador (en
ApplicationController o en tu controller particular según sea el ámbito)
y especificas

helper_method :mi_metodo

Esto hace que ese método sea llamable desde la capa de presentación. Eso
sí, el método idealmente no debería contenter código de presentación,
porque si no al usarlo desde el controlador estarías violando la
separación lógica/vista.

Saludos,


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez