2010-12-13 20 views
8

ich weiß, dass es keine wirkliche Entsprechung in Rails ist aber meine Frage ist vor allem über best practice ...Rails entspricht Djangos „Auswahl“

In Django, wenn Sie wollen einen begrenzten Satz ein Modellfeld zu begrenzen, Wahlen, würden Sie so etwas wie diese (im Modell) tun:

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

aus meinem (unverwässert) Verständnis von Rails, mir etwas ähnlichem, zum Beispiel erreichen, indem einen select-Tag in den Formularen Umgang mit Zugabe/Bearbeiten dieses Modells ...

Meine Frage ist jedoch, wo würde es sein geeignet sein, den "Auswahl" -Hash zu deklarieren (wieder rate ich hier, dass ein Hash ist, was ich brauche?). Grundsätzlich möchte ich einfach, dass es in allen Formen wiederverwendbar ist, in denen ich diese Auswahlmöglichkeiten anbieten muss, und wenn es um die Validierung auf Modellebene geht.

Jede Hilfe/Tipps würden uns freuen!

Antwort

10

Auf der Validierung Seite der Dinge, wahrscheinlich validates_inclusion_of ist, was Sie brauchen:

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 

Und dann in einem gewissen Helfer:

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

Wie für die Helfer zu erzeugen, Sie so etwas wie versuchen:

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

2 Jahre später gibt es eine bessere Option: 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

können Sie auf die Dokumentation für diese Methode verlinken? es sieht gut aus, aber mein google-fu versagt mich. – Eric

+2

oh, ich sehe, es ist ein Juwel, keine eingebaute Methode ... – Eric