дружественный идентификатор и ошибка разработки при использовании зарезервированного слова

#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)