ruby on rails - rails 3: ¿hay alguna manera de usar pluralize() dentro de un modelo? Parece que solo funciona en una vista
ruby-on-rails (5)
Parece que pluralize()
solo funciona dentro de una vista. ¿Hay alguna forma en que mis modelos puedan usar pluralize()
también?
(Tengo métodos en mi modelo que devuelven cadenas de mensajes para usuarios que no acceden a una vista, por ejemplo, mensajes enviados por mensaje de texto SMS).
Agregue esto a su modelo:
include ActionView::Helpers::TextHelper
En lugar de extender las cosas, simplemente me gusta esto:
ActionController::Base.helpers.pluralize(count, ''mystring'')
¡Espero que esto ayude a alguien más!
Esto funcionó para mí en rails 5.1 (ver el segundo método, el primer método lo está llamando).
# 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
Mi forma favorita es crear un TextHelper en mi aplicación que los proporcione como métodos de clase para usar en mi modelo:
app / helpers / 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
La inclusión de ActionView :: Helpers :: TextHelper en los trabajos de su modelo, pero también deja en desorden su modelo con muchos métodos de ayuda que no necesitan estar allí.
Tampoco está tan claro de dónde vino el método de pluralización en su modelo. Este método lo hace explícito - TextHelper.pluralize
.
Finalmente, no tendrá que agregar una inclusión a cada modelo que quiera pluralizar algo; solo puede llamarlo directamente en TextHelper.
Puede agregar un método como este en su modelo
def self.pluralize(word)
ActiveSupport::Inflector.pluralize(word)
end
y llámalo de esta manera
City.pluralize("ruby")
=> "rubies"