2010-12-13 13 views
8

Sé que no hay una verdadera equivalente en los carriles, pero mi pregunta es sobre todo sobre las mejores prácticas ...rieles equivalentes a "opciones" de Django

En Django, si desea limitar un campo modelo a un conjunto limitado de opciones, que harían algo como esto (en su modelo):

COLOR_CHOICES = (('B', 'Blue'), ('R', 'Red')) 
item_color = models.CharField(choices=COLOR_CHOICES) 

Desde mi entendimiento (básica) de rieles, que puedo lograr algo similar, por ejemplo, mediante el uso de una etiqueta de selección en las formas que se ocupan de la adición/edición de ese modelo ...

Mi pregunta es, sin embargo, ¿dónde estaría? ser apropiado para declarar el hash de "elecciones" (de nuevo estoy adivinando aquí que un hash es lo que necesito). Básicamente, solo quiero que sea fácilmente reutilizable en cualquier forma en que pueda necesitar presentar esas elecciones, y cuando se trata de validar a nivel de modelo.

¡Cualquier ayuda/consejo sería apreciada!

Respuesta

10

Por el lado de la validación de las cosas, probablemente validates_inclusion_of es lo que necesita:

class Coffee < ActiveRecord::Base 
    validates_inclusion_of :size, :in => %w(small medium large), 
    :message => "%{value} is not a valid size" 
end 

En cuanto a la generación de la ayudante, puede intentar algo como:

class Coffee < ActiveRecord::Base 
    @@coffe_size = %w(small medium large) 

    validates_inclusion_of :size, :in => @@coffe_size, 
    :message => "%{value} is not a valid size" 

    def self.coffee_size_options 
     @@coffe_size.map{ |z| [z,z]} 
    end 
end 

Y entonces de alguna ayuda;

<%= select(:coffee, :size, Coffee.coffee_size_options) %> 
0

2 años después, hay una opción mejor: values_for

class Car < ActiveRecord::Base 
    attr_accessible :brand 
    values_for :brand, :has=>[:ford, :chevy, :dodge], :add=>[:constants] 

    def doStuff 
    # Now you can... 
    Car.brands # [:ford, :chevy, :dodge] 
    Car::BRAND_FORD # "ford" 
    myCar = Car.new(:brand=>Car::BRAND_FORD) 
    myCar.valid? # true 
    myCar.brand= "duck." 
    myCar.valid? # false 
    end 
end 
+0

¿Puede acceder a la documentación de este método? se ve genial, pero mi google-fu me está fallando. – Eric

+2

oh, ya veo, es una joya, no es un método incorporado ... – Eric

Cuestiones relacionadas