2010-12-17 12 views
11

Estoy tratando de guardar un nombre en la base de datos y una sola palabra (primer nombre) funciona bien pero cuando el usuario ingresa nombre y apellido, quiero que Rails lo guarde en la base de datos como firstname-lastname en lugar de firstname lastname (espacio entre).Reemplazar espacio con guión antes de guardar usando Rails 3

Sé que tal vez debería utilizar un filtro antes de crear, pero no estoy seguro de cómo debe ser. Quiero que la validación funcione, es decir, que no haya dos personas que puedan usar el mismo nombre.

que estoy usando Rails 3.

Respuesta

3

¿Por qué no sólo tienen nombre apellido y columnas last_name en el PP, y crear su propia regla de validación para asegurarse de que la combinación es única (http: //guides.rubyonrails .org/active_record_validations_callbacks.html # creating-custom-validation-methods). También debe crear un índice único sobre esas dos columnas en su db.

0

Otra opción sería para nosotros regexp y reemplazar todos los espacios existentes con. Usted pondría algo en la línea de:

self.firstname.gsub(/\s+/, '-') 

en su modelo.

Nota: No estoy seguro si ruby ​​acepta \s como "cualquier carácter en blanco" Y creo que * debe asegurarse de que si alguien ingresa un nombre con dos espacios vecinos (o más) no convierta cada espacio en una carrera diferente, pero solo en una.

+0

Esto separa todas las cartas con un guión, no cada palabra ... – Ger

+0

@ Gearóid Oh, tienes razón! ¡Quería escribir '+' no '*'! Lo siento por eso. = P – omninonsense

28

Puede utilizar el método de inflador de ActiveSupport parameterize en la cadena.

name = 'john smith'  # => john smith 
name.parameterize  # => john-smith 

Además, Parameterize tiene la opción de utilizar la palabra a la ruptura, para que pueda reemplazar el tablero con un guión como este:

name.parameterize("_") # => john_smith 

Una ventaja de utilizar parametrizar es que normaliza la caracteres a la América, por lo ...

name = "jöhanne såltveç" 
name.parameterize  # => johanne-saltvec 
Cuestiones relacionadas