ruby-on-rails activerecord input capitalization

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.