2011-05-07 13 views
5

Użyłem przyjaznego identyfikatora, aby zezwolić użytkownikowi na dostęp z jego nazwą logowania, ale gdy próbuję zarejestrować się przy użyciu nazwy logowania, która została zarezerwowana przez przyjazny identyfikator, wystąpił błąd. Wygląda na to, że program devise nie może poprawnie wygenerować komunikatu o błędzie. Błąd działa dobrze, gdy używam authlogic.Przyjazny identyfikator i błąd przy korzystaniu z zarezerwowanego słowa

Friendly_id Config:

:reserved_words => ["index", "new", "users", "admin", "login", "logout", "books", 
        "administrator", "signup"], 

Błąd:

FriendlyId::ReservedError in Devise::RegistrationsController#create 
FriendlyId::ReservedError 

Używam:

gem 'devise', '1.3.4' 
gem 'friendly_id', '3.2.1.1' 

Odpowiedz

0

Po przejściu przez ten discussion, dodałem następujące w user.rb i Wydaje się działać poprawnie:

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 

Dodałem także warunek, w którym uratuje FriendlyId :: BlankError, ponieważ już sprawdzam to w mojej normalnej walidacji.

2

następujące prace z friendly_id 4.0.0.beta14 on 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 

Moja friendly_id.rb initializer wygląda następująco:

FriendlyId.defaults do |config| 
    config.use :slugged, :reserved 
    config.reserved_words = %w(new edit index show data) 
end 
+0

Można to skrócić do jednej linijki - 'errors.add: name, * errors.delete (: friendly_id) jeśli błędy [: friendly_id] .present?' As documented [here] (http://rubydoc.info/github/norman/friendly_id/master/FriendlyId/Reserved) –

+0

Przeglądanie tych wartości spowoduje dodanie ich do tablicy błędów. Przed sprawdzeniem czy są obecne, dodałem 'if! @errors.empty? && @errors [: friendly_id] .present? ' – heavysixer

0

Można również zmieniać swoich config/locales /en.yml lub odpowiedni plik językowy:

en: 
    activerecord: 
    errors: 
     models: 
     your_model_name: 
      attributes: 
      friendly_id: 
       exclusion: 'name is a reserved word' 

To brzmi jak Validation failed: Friendly name is a reserved word.

Powiązane problemy