2010-12-13 7 views
8

Je sais qu'il n'y a pas vraiment d'équivalent de Django dans Rails, mais ma question est la plupart du temps sur les meilleures pratiques ...Rails équivalents aux « choix »

Dans Django, si vous voulez limiter un champ de modèle à un ensemble limité de choix, vous feriez quelque chose comme ça (dans votre modèle):

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

de mon (de base) compréhension des rails, je peux obtenir quelque chose de similaire, par exemple, en utilisant une balise select dans les formulaires portant sur l'ajout/éditer ce modèle ...

Ma question est cependant, où serait-il être approprié de déclarer le "choix" hash (encore une fois je devine ici qu'un hachage est ce dont j'ai besoin?). Fondamentalement, je veux juste qu'il soit facilement réutilisable sous toutes les formes où je pourrais avoir besoin de présenter ces choix, et quand il s'agit de valider au niveau du modèle.

Toute aide/conseils serait appréciée!

Répondre

10

Du côté de la validation des choses, probablement validates_inclusion_of est ce que vous avez besoin:

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

Comme pour générer l'assistant, vous pouvez essayer quelque chose comme:

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 

Et puis dans une aide:

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

2 ans plus tard, il existe une meilleure 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

pouvez-vous lier à la documentation de cette méthode? ça a l'air génial mais mon google-fu me manque. – Eric

+2

oh, je vois, c'est une gemme, pas une méthode intégrée ... – Eric