rails 3: Есть ли способ использовать pluralize() внутри модели? Кажется, работает только в представлении


Похоже, что pluralize() работает только в пределах представления - есть ли какой-то способ, которым мои модели могут использовать pluralize() тоже?

(в моей модели есть методы, возвращающие строки сообщений для пользователей, которые не переходят в представление - например, сообщения, отправленные через SMS-сообщение.)

5 32

5 ответов:

Добавьте это в вашу модель:

include ActionView::Helpers::TextHelper

Вместо того, чтобы расширять вещи, я просто это так:

ActionController::Base.helpers.pluralize(count, 'mystring')

Надеюсь, это поможет кому-то еще!

Мой любимый способ-создать TextHelper в моем приложении, который предоставляет эти методы класса для использования в моей модели:

Приложение / помощники / text_helper.rb

module TextHelper                       
  extend ActionView::Helpers::TextHelper
end                                     

App / models / any_model.rb

def validate_something
  ...
  errors.add(:base, "#{TextHelper.pluralize(count, 'things')} are missing")
end

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

Также не совсем ясно, откуда в вашей модели появился метод pluralize. Этот метод делает его явным - TextHelper.pluralize.

Наконец, вам не нужно будет добавлять include к каждой модели, которая хочет что-то плюрализовать; вы можете просто вызвать его непосредственно на TextHelper.

Вы можете добавить такой метод в свою модель

  def self.pluralize(word)
    ActiveSupport::Inflector.pluralize(word)
  end

И назовем его так

City.pluralize("ruby")
=> "rubies"

Это сработало для меня в rails 5.1 (см. 2-й метод, первый метод вызывает его.)

# gets a count of the users certifications, if they have any.
def certifications_count
  @certifications_count = self.certifications.count
  unless @certifications_count == 0 
    return pluralize_it(@certifications_count, "certification")
  end
end

# custom helper method to pluralize.
def pluralize_it(count, string)
  return ActionController::Base.helpers.pluralize(count, string)
end