ruby on rails - Rieles: asegurar mayúsculas en el modelo?
ruby-on-rails activerecord (4)
El método que quieres es titleize
. El método de capitalize
solo tiene el primer carácter en toda la cadena, por lo que "john doe".capitalize #=> "John doe"
, "john doe".titleize #=> "John Doe"
.
En cuanto a cómo implementarlo, podría ir con un before_save
, pero me gustaría hacer este tipo de preparaciones simples de atributos únicos con pseudo-atributos. Básicamente, define un método de escritura para un atributo que ocultará el predeterminado creado por ActiveRecord
. Aún podrá acceder al atributo mediante el método write_attribute
( docs ). Si lo hace de esta manera, se asegurará de que el atributo se configure correctamente tan pronto como lo asigne , lo que significa que incluso antes de guardarlo, puede estar seguro de que su objeto está en un estado válido:
class Contact < ActiveRecord::Base
def name=(s)
write_attribute(:name, s.to_s.titleize) # The to_s is in case you get nil/non-string
end
end
En un modelo de Rails, si tengo un campo que es para nombres propios, ¿cuál es la mejor manera de asegurar que estén uniformemente capitalizados a pesar de la entrada potencialmente floja de los usuarios?
IE digamos que el modelo es Contact
y el campo es Name
. Independientemente de las entradas del usuario, quiero que las palabras se escriban en mayúscula, es decir, el modelo transformará la siguiente entrada en el siguiente resultado:
john doe -> John Doe
j doe -> J Doe
John doe -> John Doe
john doe jr -> John Doe Jr
Entonces, ¿creas una before_save
llamada before_save
y transformas el campo con una expresión regular, o creas algún tipo de validación, o algo diferente? Apreciaría mucho las respuestas con un énfasis en la razón de por qué lo haría de una manera u otra, porque eso es lo que más me aterra.
La pregunta más importante es ¿cómo mostrarás los nombres? Si va a estar en la web, como yo diría, no manejaría esto en absoluto en el modelo. La solución más simple es simplemente usar css text-tansform: capitalize;
para manejar las mayúsculas y minúsculas, pero si lo va a mostrar a menudo, querrá definir un decorador o un método auxiliar para normalizarlo por usted.
def full_name
[first_name, last_name].map { |name| name[0].upcase + name[1..-1] }.join('' '')
end
Tenga en cuenta que en lugar de asignar mayúsculas a mayúsculas solo querría mayúscula la primera letra. Alguien llamado RJ o CJ probablemente querría que la J permanezca en mayúscula.
Los datos son canónicos independientemente, ya que las partes en mayúsculas son puramente pantalla.
Sugeriría usar before_save.
como en tu modelo:
before_save :capitalize_name
def capitalize_name
self.name = self.name.split.collect(&:capitalize).join('' '') if self.name && !self.name.blank?
end
Una versión más limpia de @ tserif es la siguiente:
def name=(s)
super s.titleize
end
Esto elimina la dependencia de write_attribute
y la necesidad de especificar el nombre del atributo en favor de un método más primitivo. No veo la necesidad de to_s
, a menos que desee la capacidad de asignar un símbolo.