Ruby on Rails - плюрализация

Есть ли помощник, чтобы избежать такого рода кода?

= @leads.length == 1 ? 'is' : 'are'

Я знаю о плюрализации, но в этом случае это не помогает. Я знаю, что писать помощника было бы тривиально, я хочу знать, есть ли что-то в Rails API, который я забыл.

Спасибо,

-Tim

Ответы

Ответ 1

Как t6d сказал, что вам нужно добавить is/to the inflector Rails. Просто код из td6, но вам нужно добавить пространство имен ActiveSupport:

ActiveSupport::Inflector.inflections do |inflection|
  inflection.irregular "is", "are"
end

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

pluralize(@leads.length,'is')

выходы (для 2 выводов)

2 are

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

def pluralize_no_count(count, singular, plural = nil)
  ((count == 1 || count == '1') ? singular : (plural || singular.pluralize))
end

Ответ 2

Возможно, вы могли бы использовать pluralize и добавить перегиб для 'is'

Inflector.inflections do |inflection|
  inflection.irregular "is", "are"
end

так что

'is'.pluralize # => 'are'

(я не тестировал решение, но он должен работать.)

Ответ 3

Другой вариант - использовать библиотеку перевода i18n, включенную в рельсы.

Это позволяет вам определить слово или предложение (с интерполяциями) как с единственной, так и с множественной версией.

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

Он также предоставляет множество дополнительных дополнений и преимуществ с локализацией даты и времени. Читайте об i18n наизнанку здесь

Ответ 4

В заключение я пойду за:

Config

# inflections.rb
Inflector.inflections do |inflection|
  inflection.irregular "is", "are"
  inflection.irregular "has", "have"
end

Рельсы 3

"#{subject} #{'is'.pluralize(count)} working!"

Рельсы 2

# application_helper.rb
def signularize_or_pluralize(word, count)
  if count.to_i == 1
    word.singularize
  else
    word.pluralize
  end
end

# in the view view
"#{subject} #{signularize_or_pluralize('is', count)} working!"