Замените пробел тире перед сохранением с помощью Rails 3 - PullRequest
13 голосов
/ 17 декабря 2010

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

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

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

Ответы [ 4 ]

45 голосов
/ 05 декабря 2011

В строке можно использовать метод инфлектора 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 голосов
/ 17 декабря 2010

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

1 голос
/ 10 января 2011

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

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

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

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

0 голосов
/ 11 июня 2019

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

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

name = "Donald Duck"
name.parameterize(preserve_case: true)   # => Donald-Duck
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...