Ответ 1
Нет такого встроенного помощника, но его тривиально легко реализовать:
class TrueClass
def yesno
"Yes"
end
end
class FalseClass
def yesno
"No"
end
end
Я знаю, что я мог бы легко написать функцию и поместить ее в контроллер приложения, но я бы предпочел, если это еще что-то еще делает. В принципе, я хочу иметь что-то вроде:
>> boolean_variable?
=> true
>> boolean_variable?.yesno
=> yes
>> boolean_variable?.yesno.capitalize
=> Yes
есть ли что-то подобное в Rails-инфраструктуре?
Нет такого встроенного помощника, но его тривиально легко реализовать:
class TrueClass
def yesno
"Yes"
end
end
class FalseClass
def yesno
"No"
end
end
В Rails нет ничего.
Лучше, чем добавлять в истинные/ложные классы для достижения чего-то подобного, это сделать метод в ApplicationHelper:
def human_boolean(boolean)
boolean ? 'Yes' : 'No'
end
Затем, на ваш взгляд
<%= human_boolean(boolean_youre_checking) %>
Добавление методов к встроенным классам, как правило, неодобрительно. Кроме того, этот подход близко подходит к помощникам Rails, например raw()
.
Кроме того, один из них - отличная идея, так как они не легко поддерживаются (или тестируются).
Теперь для этого есть драгоценный камень: humanize_boolean
Затем вы просто выполните:
true.humanize # => "Yes"
false.humanize # => "No"
Он также поддерживает интернационализацию, поэтому вы можете легко изменить возвращаемую строку, включив ваш перевод для en.boolean.yes и en.boolean.no(или любой желаемый язык)
В качестве альтернативы вы также можете сделать одно из своих просмотров, например:
<%= item.bool_field? ? 'yes' : 'no' %>
Драгоценный камень humanize_boolean
расширяет TrueClass
, FalseClass
и NilClass
, который является косвенным расширением, которое я предпочел бы избежать.
Я нашел, что этот помощник с переводом на верхний уровень изолирован, дружелюбен к изменениям, и вы можете дать ему что-нибудь правдивое или ложное:
# app/helpers/application_helper.rb
class ApplicationHelper
def humanize_boolean(boolean)
I18n.t((!!boolean).to_s)
end
end
# config/locales/en.yml
en:
:true: 'Yes'
:false: 'No'
Выполнение !!(boolean).to_s
гарантирует, что переменные, переданные аргументу, являются значениями "true"
или "false"
при построении строки перевода.
При использовании:
# app/views/chalets/show.html.erb
<%= humanize_boolean(chalet.rentable?) %>