Как реализовать 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