2010-12-13 43 views
8

我知道有Rails中沒有真正的等價的,但我的問題主要是關於最佳實踐...的Rails相當於Django的「選擇」

在Django中,如果你想一個模型字段限制爲一組有限的選擇,你會做這樣的事情(在模型中):

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

Rails中的我(基本)的瞭解,我可以實現類似的東西,例如,在處理添加的形式使用選擇標籤/編輯該模型...

但是我的問題是,它會在哪裏適合宣佈「選擇」哈希(我在這裏猜測,哈希是我需要的?)。基本上我只是希望它能夠以任何形式輕鬆地重複使用,我可能需要提供這些選擇,以及何時需要在模型級進行驗證。

任何幫助/提示,​​將不勝感激!

回答

10

對事物的驗證方面,可能validates_inclusion_of是你所需要的:

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

至於產生的幫手,你可以嘗試這樣的:

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 

然後在一些幫助:

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

2年過去了,還有更好的選擇: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

你能鏈接到這個方法的文檔嗎?它看起來不錯,但我的谷歌福正在讓我失望。 – Eric 2012-11-04 07:09:42

+2

哦,我知道,這是一顆寶石,而不是一種內置的方法...... – Eric 2012-11-04 07:11:17