Rails 3 разрабатывает пароль для обновления без выхода из системы - PullRequest
1 голос
/ 14 августа 2011

Я использую Devise в своем приложении Rails 3.0.9 для аутентификации пользователей. Поскольку я хотел иметь возможность управлять пользователями, я создал следующие пользовательские контроллеры:

    class UsersController < ApplicationController

  def index
     @users = User.all
   end

   def new
     @user = User.new
   end

   def create
     @user = User.new(params[:user])
     if @user.save
       flash[:notice] = "Successfully created User." 
       redirect_to users_path
     else
       render :action => 'new'
     end
   end

   def edit
     @user = User.find(params[:id])
   end

   def update
     @user = User.find(params[:id])
     params[:user].delete(:password) if params[:user][:password].blank?
     params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank?
     if @user.update_attributes(params[:user])
       if current_user.update_with_password(params[:user])
           sign_in(current_user, :bypass => true)
       end
       flash[:notice] = "Successfully updated User."
       redirect_to users_path
     else
       render :action => 'edit'
     end
   end

   def destroy
     @user = User.find(params[:id])
     if @user.destroy
       flash[:notice] = "Successfully deleted User."
       redirect_to users_path
     end
   end

end

Это работает для показа, создания и удаления пользователей, но я столкнулся с проблемой при обновлении паролей.

Когда я обновляю пароль для текущей учетной записи, она автоматически выходит из системы.

В контроллере я попытался исправить это с помощью: (вы можете увидеть это в коде выше)

if current_user.update_with_password(params[:user])
   sign_in(current_user, :bypass => true)
end

Но это дает мне эту ошибку ->

undefined method `update_with_password' for nil:NilClass 

Что я действительно ищу, так это возможность обновить любой пароль учетной записи, не выходя из нее (поскольку администраторы могут изменять пароль обычных пользователей).

Ответы [ 2 ]

8 голосов
/ 22 августа 2011

Не нужно писать

Этот код в контроллере

if current_user.update_with_password(params[:user])
  sign_in(current_user, :bypass => true)
end

Вместо этого вы должны продолжить с ниже одного

if @user.update_attributes(params[:user])
   sign_in(current_user, :bypass => true)
   redirect_to users_path
end

ура :) 1009 *

1 голос
/ 10 января 2012

Самый простой способ сделать это - позвонить

sign_in(current_user, :bypass => true)

После обновления.

Вот как выглядит действие моего контроллера:

def update_password
  if current_user.update_with_password(params[:user])
    sign_in(current_user, bypass: true)
    flash[:notice] = "Updated Password Successfully"
  else
    flash[:error] = "There was an error updating your password, please try again."
  end
end

Я думаю, что это в основном то, что предложил @challenge, но я просто хотел сделать немного чище и проще для понимания.

...