2010-02-15 8 views
21

Tengo una constante que solo se usa en vistas, pero se usa de diferentes formas en diferentes lugares. Es una matriz de nombres de opciones, y se usa para cuadros de selección, pero también lo uso en otras vistas para ver si se encuentran cadenas en esta matriz y respondo en consecuencia.La mejor manera de manejar vistas y constantes sólo de ayudante en Rails

¿Cuál es la mejor manera de manejar esto para mantener SECO?

Inicialmente creé una constante en un ayudante, pero eso no parece ser accesible en las vistas.

Desde entonces he cambiado a la creación de un método en un helper, que no hace nada excepto devolver la constante. Sin embargo, esto realmente parece estar en contra del espíritu de Rails, ya que ahora esencialmente estoy usando una constante de caja inferior.

Por supuesto, podría pegarlo en un modelo, pero realmente no tiene nada que ver con ninguno de los modelos.

Respuesta

35

Puede definir las constantes en los ayudantes, pero tendrá que hacer referencia a ellas por su nombre completo en sus vistas.

application_helper.rb

module ApplicationHelper 
    MyConstant = "something" 
end 

En cualquier vista:

<%= ApplicationHelper::MyConstant %> 
+0

En controladores/modelos puede hacer 'include ApplicationHelper', para evitar escribirlo. No puedes hacerlo dentro de las vistas, ¿verdad? :/ – m33lky

+0

Resulta que los módulos que "incluye" en el controlador están disponibles para las vistas. – m33lky

+2

También puede escribir un método en el ayudante para referirse a él para que no tenga que repetir el nombre del ayudante en la vista. – Will

5

Póngalo en config/initializers/constants.rb y estará disponible en todas partes.

+0

parece un poco desafortunado para agregar una constante global cuando sólo se lleguen a utilizar en las vistas y los ayudantes, no estoy seguro eso es mejor que solo usar un método para alias. –

+0

FYI - este ya no es el caso en el modo de producción de rieles 4: las plantillas viven en un espacio de nombres diferente y necesitan acceder a constantes a través de ApplicationController: CONSTANT_NAME – Kevin

Cuestiones relacionadas