¿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
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