Заменяйте пространство тире перед сохранением с помощью Rails 3

Я пытаюсь сохранить имя в базе данных, и одно слово (первое имя) отлично работает, но когда пользователь вводит имя и фамилию, я хочу, чтобы Rails сохранил его в базе данных как имя-имя, а не имя firstname (пробел между ними). ​​

Я знаю, что я, возможно, должен использовать фильтр перед созданием, но я не уверен, как это должно выглядеть. Я хочу, чтобы валидация работала, т.е. Ни один из двух человек не мог использовать одно и то же имя.

Я использую Rails 3.

Ответ 1

Почему у вас нет только столбцов first_name и last_name в db и создайте собственное правило проверки, чтобы убедиться, что комбинация уникальна (http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom- валидации-метода). Вы также должны создать уникальный индекс над этими двумя столбцами в своем db.

Ответ 2

Вы можете использовать метод inflector ActiveSupport parameterize в строке.

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

Кроме того, параметризация использует опцию для разрыва слова, поэтому вы можете заменить тире подчеркиванием следующим образом:

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

Преимущество использования параметризации заключается в том, что он нормализует символы для латинского языка, поэтому...

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

Ответ 3

Другой вариант - мы будем использовать regexp и заменять все существующие пробелы. Вы поместите что-то в соответствие с:

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

в вашей модели.

Примечание. Я не уверен, что ruby ​​принимает \s как "любой символ пробела". И я думаю, что * должен убедиться, что если кто-то вводит имя с двумя соседними пространствами (или более), он не будет преобразовывать каждый пространство в отдельный тире, но только в один.

Ответ 4

Другой ответ правильный,

Но, если вы хотите сохранить регистр при параметризации

name = "Donald Duck"
name.parameterize(preserve_case: true)   # => Donald-Duck