Rails 3, лучший способ быть СУХИМ с метками переключателей?

Предположим, что для целочисленного поля с именем «favfood» мы представляем варианты переключателей как

0 indicates "no favorite"
1 indicates "Wine and cheese"
2 indicates "Burger with everything"

В нашем представлении _edit мы отображаем переключатели с понятными метками выше.

В представлениях /show и /index (и в некоторых других местах), когда мы отображаем предпочтения пользователя, мы отображаем один и тот же соответствующий длинный текст.

Кажется несухим помещать литеральные строки рядом с каждым переключателем в _edit, а затем предоставлять некоторую логику для отображения ОДИНАКОВОЙ литеральной строки в /show и /index и т. д. и т. д. и т. д. на основе текущего значения.

Кроме того, мы должны многократно использовать ОДНУ ОДНУ логику, которая говорит, что если значение = 1, отображается «Первый выбор», если значение = 2, отображается «Второй выбор».

Что такое «рельсовый путь» для обработки удобных меток для меток радио, чтобы метки (И их связь со значениями поля) определялись один раз?


person jpw    schedule 03.02.2011    source источник


Ответы (2)


Есть две вещи, которые вы должны сделать. Один использует интернационализацию (I18n), чтобы ваш текст сохранялся в вашем файле en.yml, и вы могли использовать метки вместо строк:

# en.yml
en:
  no_favorite: 'No favorite'
  wine_and_cheese: 'Wine and Cheese'
  burger_with_everything: 'Burger with everything'

# You can then translate the labels like this
I18n.t :no_favorite
I18n.t :wine_and_cheese
I18n.t :burger_with_everything

Следующим шагом будет создание какого-то хэша или класса, который хранит и преобразует целочисленные значения для вас. Простое решение массива может выглядеть так:

OPTIONS = [:no_favorite, :wine_and_cheese, :burger_with_everything]

Затем вы можете использовать такие параметры:

selected_value = 1
I18n.t OPTIONS[selected_value] # => wine_and_cheese
OPTIONS.index :wine_and_cheese # => 1

Кроме того, если выбранная опция была значением модели (скажем, User#food_preference), вы могли бы определить функцию для отображения пищевых предпочтений этого пользователя:

class User
  OPTIONS = [:no_favorite, :wine_and_cheese, :burger_with_everything]

  def display_food_preference
    I18n.t OPTIONS[food_preference]
  end
end
person Pan Thomakos    schedule 03.02.2011
comment
это отличное решение, очень хорошо объясненное СПАСИБО! - person jpw; 03.02.2011

Я не уверен, что вы пытаетесь здесь сделать, но почему бы не сохранить строки в модели. Нравится:

class User < ActiveRecord::Base
    def favfood_description
        "bla bla" if favfood == 0
    end
end
person alexcepoi    schedule 03.02.2011