Подтвердить что ты не робот

Rails (или Ruby): Да/Нет вместо True/False

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

>> boolean_variable?
=> true
>> boolean_variable?.yesno
=> yes
>> boolean_variable?.yesno.capitalize
=> Yes

есть ли что-то подобное в Rails-инфраструктуре?

4b9b3361

Ответ 1

Нет такого встроенного помощника, но его тривиально легко реализовать:

class TrueClass
  def yesno
    "Yes"
  end
end

class FalseClass
  def yesno
    "No"
  end
end

Ответ 2

В Rails нет ничего.

Лучше, чем добавлять в истинные/ложные классы для достижения чего-то подобного, это сделать метод в ApplicationHelper:

def human_boolean(boolean)
    boolean ? 'Yes' : 'No'
end

Затем, на ваш взгляд

<%= human_boolean(boolean_youre_checking) %>

Добавление методов к встроенным классам, как правило, неодобрительно. Кроме того, этот подход близко подходит к помощникам Rails, например raw().

Кроме того, один из них - отличная идея, так как они не легко поддерживаются (или тестируются).

Ответ 3

Теперь для этого есть драгоценный камень: humanize_boolean

Затем вы просто выполните:

true.humanize # => "Yes" 
false.humanize # => "No"

Он также поддерживает интернационализацию, поэтому вы можете легко изменить возвращаемую строку, включив ваш перевод для en.boolean.yes и en.boolean.no(или любой желаемый язык)

Ответ 4

В качестве альтернативы вы также можете сделать одно из своих просмотров, например:

<%= item.bool_field? ? 'yes' : 'no' %>

Ответ 5

Драгоценный камень 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?) %>