2011-05-07 12 views
5

Utilicé ID amigable para permitir el perfil de acceso del usuario con su nombre de usuario, pero cuando trato de registrarme con el nombre de usuario que ha sido reservado por el Id. Amistoso, recibí un error. Parece que el dispositivo no puede mostrar el mensaje de error correctamente. El error simplemente funciona bien cuando estoy usando authlogic.ID amigable y error al utilizar la palabra reservada

Friendly_id Config:

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

error:

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

que estoy usando:

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

Respuesta

0

Después de pasar por este discussion, añadí siguiente en user.rb y parece funcionar bien:

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 

También he agregado una condición en la que rescatará FriendlyId :: BlankError porque ya lo estoy verificando en mi validación normal.

2

Los siguientes trabajos con 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 

Mi inicializador friendly_id.rb se ve así:

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

Esto se puede acortar a un trazador de líneas - 'errors.add: name, * errors.delete (: friendly_id) if errors [: friendly_id] .present?' Como documentado [aquí] (http://rubydoc.info/github/norman/friendly_id/master/FriendlyId/Reserved) –

+0

Al inspeccionar estos valores, los agregará a la matriz de errores. Antes de verificar si están presentes, agregué 'if [email protected]? && @errors [: friendly_id] .present? ' – heavysixer

0

También puede modificar su configuración/locales /en.yml o archivo de lenguaje apropiado:

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

Se lee como Validation failed: Friendly name is a reserved word.

Cuestiones relacionadas