CGI::escape(user.username)
этот метод будет URI-кодировать значение, поэтому он безопасен в URL.Разве Rails не делает это автоматически?Вы пытались не убегать и не помещать в него сумасшедших персонажей?
Правка и противоположную версию:
CGI::unescape(params[:id])
Хотя я все еще чувствую, что рельсы могут справиться с этим автоматически для вас.Возможно, вам захочется протестировать.
Снова отредактируйте:
В Rails есть метод .parameterize
, поэтому: user.username.parameterize
сделает строку пригодной для URL, это задокументировано здесь: http://apidock.com/rails/v3.0.7/String/parameterize
Основная проблема в том, что если у вас есть 2 имени пользователя: my.user
и myuser
, они оба будут параметризоваться в одну строку myuser
Я думаю, что принятый способ сделать это(как показывает пример документа) следующим образом:
"#{user.id}-#{user.username.parameterize}"
таким образом, если вы сделаете User.find(params[:id])
, он удаляет все после первого числа и просто использует его в качестве идентификатора.Существуют гемы, которые сделают уникальную строку, дружественную к параметрам, которую вы можете использовать, если вы действительно против использования идентификатора пользователя в параметрах (есть ли причина для такой проблемы?).Один из таких камней - friendly_id: https://github.com/norman/friendly_id/, хотя есть и другие.Идея состоит в том, что в вашей модели есть еще одно поле, специально предназначенное для URL, и оно автоматически генерируется в before_create на основе вашего поля имени пользователя.Он должен быть уникальным и дружественным к параметрам, о котором заботится самоцвет.
Надеюсь, этот ответ поможет вам больше: p