2012-03-26 6 views
5

Ive ha il seguente problema. Ho un modello chiamato utente che ha una colonna chiamata attivata. Sto cercando di aggiornare quel valore con il metodo attivato ?, ma mi dà l'errore: Convalida fallita: la password non può essere vuota, la password è troppo corta (minimo 6 caratteri) Che non ha senso per me, perché non sto toccando il campo password! Voglio solo aggiornare la colonna attivata. Sto mettendo qui il codice che ritengo rilevante, ma se pensi di aver bisogno di più basta chiedere :) Grazie mille in anticipo!Rails update_attribute

Modello:

attr_accessor :password 
attr_accessible :name, :email, :password, :password_confirmation, :activated 
has_many :sucu_votes 

email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

validates :name, :presence => true, 
            :length => { :maximum => 50 } 

validates :email, :presence => true, 
            :format => {:with => email_regex}, 
            :uniqueness => { :case_sensitive => false } 

validates :password, :presence => true, 
             :length => { :within => 6..15 }, 
             :confirmation => true 

before_save :encrypt_password 

def activated? 
    self.update_attributes!(:activated => true) 
    return self.activated 
end 

controller da cui il metodo attivato? si chiama

def activate 
if request.get? 
     user=User.find_by_id(params[:id]) 
     if user.activated? 
      flash[:notice]="Your account has been activated" 
      #redirect_to :controller => 'sessions', :action => 'new' 
     else 
      flash[:error]="We couldnt activate the account" 
      redirect_to :controller => 'sessions', :action => 'new' 
     end 
    end 
end 

risposta

12

due cose, in primo luogo la convenzione rubino è di utilizzare metodi predicato per restituire vero o falso e non di fare nulla più come aggiornare un record. Questo non causa il tuo problema, ma è una deviazione rispetto a ciò che altri programmatori si aspetterebbero. In secondo luogo, invece di chiamare update_attributes provare solo chiamando:

update_attribute(:activated, true)

Questo dovrebbe saltare il resto dei callback per la cronaca

+0

La ringrazio molto! In realtà l'avevo già fatto prima, ma non funzionava per un altro motivo. Ma è tutto ok ora :) – gumlym