Заменяйте пространство тире перед сохранением с помощью 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