2010-12-13 22 views
8

wiem, nie ma realnego odpowiednika w Rails, ale moje pytanie jest głównie o najlepsze praktyki ...Szyny równoważne „wyborów” Django

W Django, jeśli chcesz ograniczyć pole modelu do ograniczonego zestawu wybory, byś zrobił coś takiego (w modelu):

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

z mojego (podstawowa) zrozumienia Rails, mogę osiągnąć coś podobnego, na przykład, przy użyciu wybierz znacznik w postaci zajmujących się dodanie/edycja tego modelu ...

Moje pytanie brzmi, gdzie by to zrobiło być odpowiednie, aby zadeklarować hash "wyboru" (znowu zgaduję, że hasz jest tym, czego potrzebuję?). Zasadniczo po prostu chcę, aby był łatwy do ponownego wykorzystania w dowolnych formach, w których może być konieczne zaprezentowanie tych wyborów, a także w przypadku walidacji na poziomie modelu.

Każda pomoc/wskazówki będą mile widziane!

Odpowiedz

10

Na stronie walidacji rzeczy, prawdopodobnie validates_inclusion_of jest to, czego potrzebujesz:

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

chodzi o generowanie pomocnika, można spróbować coś takiego:

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 

A potem w jakiś pomocnik:

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

Dwa lata później istnieje lepsza opcja: 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

Czy można utworzyć łącze do dokumentacji dla tej metody? wygląda świetnie, ale mój google-fu mnie zawodzi. – Eric

+2

oh, widzę, to klejnot, a nie wbudowana metoda ... – Eric