Как реализовать Yes / No вместо Boolean для определенных случаев в Rails?

Я новичок в программировании, но в моем приложении я хочу, чтобы определенные случаи отображали "да" или "нет" вместо "true"или " false". Я не уверен, что лучший способ сделать это, я читал этой вопрос, но на самом деле не понимал, как его реализовать. Может ли кто-нибудь помочь мне, было бы лучше поместить это в инициализаторы, помощники или где-то еще? Я хочу иметь возможность вызывать что-то в моих представлениях, где я хочу, чтобы Да/нет отображалось, или альтернативно создавать пользовательские данные тип, где в моей мигации я могу просто создать что-то вроде t.boolean_yesno, а затем для каждого столбца я делаю это, чтобы он просто хранил trues как yes и falses как no.

Я был бы признателен за руку вытащила меня на правильном пути, у меня нет опыта с инициализаторы или помощников. Спасибо!

3 ответов


районов

Я рекомендую использовать локали Rails. Они позволяют определить текст языка для любой из переменных. Например, ваше приложение может сказать "Да"/"нет"для носителей английского языка и"Oui" / " Non " для носителей французского языка.

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

пример:

#./config/locales/en.yml
en:
  TrueClass: "Yes"
  FalseClass: "No"

#./app/views/items/index.html.erb
The value is <%= translate(myboolean.class) %>
The translate method can be abbreviated like this <%= t myboolean.class %>

хелперы

вы, вероятно, увидите, что другие люди кодируют его так, используя помощника:

#./app/helpers/application.rb
def yesno(x)
  x ? "Yes" : "No"
end

# ./app/views/items/index.html.erb
<%= yesno(myboolean) %>

или как это, используя константу:

#./app/helpers/application.rb
YESNO = {true: "Yes", false: "No"}

# ./app/views/items/index.html.erb
<%= YESNO[myboolean] %>

это быстрые и грязные PHP-подобные решения. Есть лучшие способы сделать это.

Обезьяна Ямочный

вы задали этот вопрос:Rails (или Ruby): Да/нет вместо True/False.

# ./app/lib/extensions/true_class.rb
class TrueClass
  def yesno
   "Yes"
  end
end

# ./app/views/items/index.html.erb
<%= myboolean.yesno %>

это называется "исправление обезьяны" класса Ruby. В общем, это не очень хорошая идея для того, чтобы делать то, что вы пытаетесь сделать. Почему бы и нет? Потому что он разбивает существующий класс Ruby, чтобы заставить этот метод во всем вашем коде. Это может быть нормально в редких случаях (IMHO), но определенно не для исправления текста представления обезьяны в логический класс (снова IMHO).

как насчет типа данных миграции?

у вас есть правильное общее представление о создании собственных данных миграции тип, но это может быть излишним для вашего случая, потому что логическое значение является таким типичным совпадением один к одному для Да / нет. Когда вы хотите создать свой собственный тип? Например, если вы хотите сохранить yes / no, используя разные типы примитивов базы данных, такие как флаг using a bit в одной базе данных и перечисление string в другой базе данных.

декораторы

декоратор является общей концепцией для любого приложения. В Rails декоратор-это способ добавить логику представления к существующей модели или классу.

рельсы локали по существу декораторы.

для более продвинутых потребностей есть хороший драгоценный камень декоратора под названием "Draper", который прост в использовании. Использование декораторов, как правило, помогает просматривать код хорошо организован, хорошо пространства имен и проще тестировать.


самый простой вариант получить настройку-создать вспомогательный метод, который вы можете поместить в Помощник приложения.

# in app/helpers/application_helper.rb

def boolean_to_words(value)
  value ? "Yes" : "No"
end

это аналогично многим другим помощникам преобразования Rails, таким как number_to_currency


если у вас есть