#ruby-on-rails-3 #devise #friendly-id
#ruby-on-rails-3 #разработка #дружественный идентификатор
Вопрос:
Я использовал дружественный идентификатор, чтобы разрешить пользователю доступ к профилю с их именем входа, но когда я пытаюсь зарегистрироваться с именем входа, которое было зарезервировано дружественным идентификатором, я получаю сообщение об ошибке. Кажется, devise не может правильно отобразить сообщение об ошибке. Ошибка просто отлично работает, когда я использую authlogic.
Конфигурация Friendly_id:
:reserved_words => ["index", "new", "users", "admin", "login", "logout", "books",
"administrator", "signup"],
Ошибка:
FriendlyId::ReservedError in Devise::RegistrationsController#create
FriendlyId::ReservedError
Я использую:
gem 'devise', '1.3.4'
gem 'friendly_id', '3.2.1.1'
Ответ №1:
Следующее работает с friendly_id 4.0.0.beta14 на Rails 3.1.1
extend FriendlyId
friendly_id :name
after_validation :validate_reserved
def validate_reserved
if @errors[:friendly_id].present?
@errors[:name] = "is reserved. Please choose something else"
@errors.messages.delete(:friendly_id)
end
end
Мой инициализатор friendly_id.rb выглядит следующим образом:
FriendlyId.defaults do |config|
config.use :slugged, :reserved
config.reserved_words = %w(new edit index show data)
end
Комментарии:
1. Это можно сократить до однострочного —
errors.add :name, *errors.delete(:friendly_id) if errors[:friendly_id].present?
как описано здесь2. Проверка этих значений вообще добавит их в массив ошибок. Прежде чем проверять, присутствуют ли они, я добавил
if !@errors.empty? amp;amp; @errors[:friendly_id].present?
Ответ №2:
Или просто отредактируйте config/initilaizers/friendly_id.rb
файл и добавьте свои зарезервированные слова в
config.reserved_words = %w( [...] )
блокируется, как свидетельствует документация.
Ответ №3:
После прохождения этого обсуждения я добавил следующее в user.rb, и, похоже, оно работает нормально:
after_validation :validate_reserved
def validate_reserved
slug_text
rescue FriendlyId::BlankError
rescue FriendlyId::ReservedError
@errors[friendly_id_config.method] = "is reserved. Please choose something else"
return false
end
Я также добавил условие, при котором оно спасет FriendlyId::BlankError, поскольку я уже проверяю его при моей обычной проверке.
Ответ №4:
Вы также можете изменить свой config / locales /en.yml или соответствующий языковой файл:
en:
activerecord:
errors:
models:
your_model_name:
attributes:
friendly_id:
exclusion: 'name is a reserved word'
Это читается как Validation failed: Friendly name is a reserved word
.
Ответ №5:
Спасибо @Jerome, это исправляет мою ошибку <%= link_to ‘Surt’, destroy_user_session_path, метод: :delete%> Не перенаправляет пользователя / sign_out, просто добавляя sign_out к зарезервированным словам friendly_id
config/initilaizers/friendly_id.rb
config.reserved_words = %w(new edit index session login logout sign_out users admin
stylesheets assets javascripts images)