изменение пароля с помощью authlogic - проверка не перехватывает пустые данные - PullRequest
4 голосов
/ 18 ноября 2009

Я пытаюсь создать форму, позволяющую пользователям изменять свой пароль:

Вид:

- form_tag change_password_users_path do

  = error_messages_for :user, :header_message => "Please Try Again", :message => "We had some problems updating your account" 
  %br

  = label_tag :password, "New password:"
  = password_field_tag "password"
  %br

  = label_tag :password_confirmation, "NConfirm new password:"
  = password_field_tag "password_confirmation"
  %br

  = submit_tag "Update Account"

Контроллер:

def change_password
  @user = current_user
  if request.post?
    @user.password = params[:password]
    @user.password_confirmation = params[:password_confirmation]
    if @user.save
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end        
  end
end

Authlogic обнаруживает ошибки проверки, когда пароль «слишком короткий» или пароль не соответствует подтверждению, но ничего не делает, когда форма отправляется с пустыми обоими полями. @ user.save должен возвращать true, потому что я перенаправлен на 'user_path (current_user)'.

Пароль фактически не изменяется в базе данных.

Спасибо за вашу помощь.

Ответы [ 4 ]

2 голосов
/ 02 ноября 2010

Я думаю, вы также должны указать params [: user] [: current_password], иначе вы не сможете сохранить @user. И когда я тестировал, я обнаружил, что current_user будет потерян после смены пароля, поэтому вам нужно обновить usersession.

Добавьте аксессор current_password к вашей модели пользователя

class User < ActiveRecord::Base   
  act_as_authentic   
  attr_accessor :current_password 
end

В пользовательском контроллере

def change_password
  @user = current_user
  if @user.valid_password? params[:user][:current_password]
    @user.password = params[:user][:password]
    @user.password_confirmation = params[:user][:password_confirmation]
    if @user.changed? && @user.save
      UserSession.create(:login => @user.login, :password => params[:user][:password])
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end
  end
end
1 голос
/ 01 декабря 2009

Я предлагаю вам позвонить @user.changed?, как показано в следующем примере, чтобы проверить наличие пустых паролей:

def change_password
  @user = current_user
  if request.post?
    @user.password = params[:user][:password]
    @user.password_confirmation = params[:user][:password_confirmation]
    if @user.changed? && @user.save
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end
  end
end
1 голос
/ 18 ноября 2009

Видимо, это и есть предполагаемое поведение.

http://www.ruby -forum.com / тема / 198836

По крайней мере, теперь я знаю ...

Спасибо.

0 голосов
/ 31 октября 2013

Еще один способ сделать это - использовать контексты проверки ActiveModel. Вам нужно будет добавить контекстно-зависимую проверку к вашей модели пользователя:

validates :password, # :password_confirmation,
          :presence => {:message => 'Please enter your new password.'},
          :on => :reset_password

Тогда в контроллере это будет просто:

def change_password
  @user = current_user
  if request.post?
    @user.password = params[:password]
    @user.password_confirmation = params[:password_confirmation]
    if @user.save(:context => :reset_password)
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end        
  end
end

Надеюсь, он подойдет тем, кто не был удовлетворен другими предлагаемыми решениями.

...