Domanda

Sono l'aggiunta di una funzione di ripristino della password per la mia applicazione Rails che utilizza Authlogic. Stavo seguendo qui la guida: http: // www .binarylogic.com / 2008/11/16 / Tutorial-reset-password-con-Authlogic / e tutto funziona come vorrei tranne per una cosa: il modulo di reimpostazione della password accetta password vuote e semplicemente non lo fa cambiarli.

Ho cercato in giro, e hanno imparato che questo è il comportamento di default previsto perché permette di fare modificare all'utente forme che cambiano solo la password dell'utente se entrano uno nuovo, e ignorare altrimenti. Ma in questo caso, io in particolare voglio far rispettare la convalida della password come quando un utente si registra inizialmente. Ho trovato due soluzioni possibili per questo problema, ma non sono stati in grado di capire come implementare una di esse.

1) Qualcuno ha chiesto questa stessa domanda su Google Gruppi:

salva con password vuota

La risposta di Ben è stato quello di utilizzare @user.validate_password = true alla validazione forza della password. Ho provato questo ma ho un errore metodo non definito:. undefined method 'validate_password_field=' for #<User>

2) Sembra che ci sia una possibilità di configurazione Authlogic chiamato ignore_blank_passwords. È documentato qui:

Modulo: Authlogic :: ActsAsAuthentic :: password :: Config # ignore_blank_passwords

Questo appare come avrebbe funzionato, ma la mia comprensione è che si tratta di un'opzione di configurazione globale che si utilizza nella vostra chiamata acts_as_authentic iniziale nel modello User, e non voglio cambiarlo a livello di applicazione, come faccio io avere una forma di modifica regolare per gli utenti dove voglio password vuote per essere ignorati per impostazione predefinita.

Chiunque ha trovato una soluzione a questo? Vedo validate_password= nel registro delle modifiche per Authlogic 1.4.1 e nulla su di esso essendo stato rimosso da allora. Sto semplicemente usando in modo errato? C'è un modo per utilizzare ignore_blank_passwords su una base per-request?

È stato utile?

Soluzione

Questo quello che ho fatto.

class User < ActiveRecord::Base
  attr_accessor :ignore_blank_passwords

  # object level attribute overrides the config level
  # attribute
  def ignore_blank_passwords?
    ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
  end
end

Ora nel controller, impostare l'attributo ignore_blank_passwords su false.

user.ignore_blank_passwords = false

Qui, si sta lavorando all'interno dei confini di Authlogic. Non è necessario cambiare la logica di convalida.

Altri suggerimenti

Questa è una specie di un vecchio thread, ma dal momento che è senza risposta vi posterò questo.

sono riuscito a farlo un po 'più pulito rispetto alle altre soluzioni, "aiutare" le convalide Authlogic con la mia.

Ho aggiunto questo per utente:

class User < ActiveRecord::Base

  ...

  attr_writer :password_required

  validates_presence_of :password, :if => :password_required?

  def password_required?
    @password_required
  end

  ...
end

È possibile ridurre a due linee di fare attr_accessor e utilizzando :if => :password_required (senza interrogatori), ma preferisco questo altro sintassi con il segno di interrogazione.

Allora la vostra azione di controllo può essere fatto in questo modo:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  @user.password_required = true

  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Ciò avrà un effetto locale; il resto della domanda non sarà influenzato (a meno che non password_required è impostata su true in altri luoghi, che è).

Spero che aiuta.

User.ignore_blank_passwords = false

Usa modello, non oggetto per impostare questa proprietà.

def update_passwords
  User.ignore_blank_passwords = false
  if @user.update_attributes(params[:user])
    ...
  end
  User.ignore_blank_passwords = true
end

Forse verificare il valore del parametro nel regolatore? (Codice d'aria):

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  if @user.password.blank?
    flash[:error] = "Password cannot be blank"
    render :action => :edit
    return
  end
  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

A parte la soluzione di Zetetic si potrebbe fare in questo modo:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]

  if @user.changed? && @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Si sta controllando se fondamentalmente Authlogic cambiato il record utente (che non è così se la password è vuota). Nel blocco il resto si può verificare se la password era vuoto e aggiunge un messaggio di errore appropriato al record utente o visualizzazione di un messaggio flash.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top