Рельсы, эквивалентные "выборам" Джанго - PullRequest
8 голосов
/ 14 декабря 2010

Я знаю, что в Rails нет реального эквивалента, но мой вопрос в основном о наилучшей практике ...

В Django, если вы хотите ограничить поле модели ограниченным набором вариантов, вы должны сделатьчто-то вроде этого (в вашей модели):

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

Исходя из моего (базового) понимания Rails, я могу добиться чего-то похожего, например, используя тег select в формах, связанных с добавлением / редактированием этогомодель ...

Мой вопрос, однако, где уместно объявить хэш "choices" (опять же, я предполагаю, что хеш - это то, что мне нужно?).По сути, я просто хочу, чтобы его можно было легко повторно использовать в любых формах, где мне может потребоваться представить эти варианты, а также когда дело доходит до проверки на уровне модели.

Буду признателен за любую помощь / советы!

Ответы [ 2 ]

10 голосов
/ 14 декабря 2010

Что касается валидации, вероятно, 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 голосов
/ 26 июля 2012

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...