2010-12-13 38 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