0

Я пытаюсь обновить пароль пользователя на странице профиля. Чтобы дать вам контекст, пользователь нажмет ссылку «Изменить пароль» на странице своего профиля, которая затем покажет модальную версию с помощью bootstrap_form_for с просьбой подтвердить старый пароль, ввести новый пароль и подтвердить новый пароль.Ruby on Rails Изменение/обновление пароля с Modal на странице профиля Проверка старого пароля, добавление нового пароля, подтверждение нового пароля

В настоящее время успешно прошел метод, однако пароль в базе данных не изменяется. Я не использую Devise, это делается с нуля.

В идеале, я хочу, чтобы старый пароль был правильно проверен, а новый обновлен в базе данных.

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

Обратите внимание! Спасибо!

Маршруты

resources :users do 
    member do 
    get :confirm_email 
    end 
end 

get 'change_password' => 'users#change_password' 
patch 'change_password' => 'users#change_password' 

Пользователи Контроллер:

def update 
    @user = User.find(@current_user) 
    User.update(@user, edit_user_params) 
    @user.save 
    redirect_to user_path 
end 

def change_password 
    @user = User.find(@current_user) 
    current_password = params[:user][:current_password] 
    user = User.authenticate(@user.email, current_password) 
    if @user && user 
    # @user.update.password = params[:new_password] 
    # new_password = params[:password] 
    # @user.update(new_password) 
    User.update(@user, change_password_params) 
    @user.save 
    flash[:success] = "Password successfully changed!" 
    redirect_to user_path(@current_user) 
    else 
    flash[:danger] = "Your old password was incorrect. Please try again." 
    redirect_to user_path(@current_user) 
    end 
end 

private 

def user_params 
    params.require(:new_user).permit(:name,:email,:password) 
end 

def edit_user_params 
    params.require(:user).permit(:name,:email,:password,:city,:state_id,:country_id,:about) 
end 

def change_password_params 
    params.require(:user).permit(:password) 
end 

edit.html.erb (модальный часть)

<!-- Change Password Modal --> 

<div id="changepasswordmodal" class="modal fade" tabindex="-1" role="dialog"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">×</button> 
        <h3 class="">Change Password</h3> 
      </div> 
      <div class="modal-body"> 
       <%= bootstrap_form_for @user, url: change_password_path do |p| %> 
       <%= p.password_field :current_password, hide_label: true, placeholder: "Enter your Old Password", class: "input-lg required" %> 
       <%= p.password_field :password, hide_label: true, placeholder: "Enter a New Password", class: "input-lg required" %> 
       <%= p.password_field :password_confirmation, hide_label: true, placeholder: "Confirm New Password", class: "input-lg required"%> 

       <%= p.submit "Change Password", :class=> "btn btn-primary" %> 
       <% end %> 
      </div> 
     </div> 
    </div> 
</div> 

Модель пользователя (Относится только часть)

class User < ActiveRecord::Base 
    has_secure_password 

    before_create :confirmation_token 

    belongs_to :state 
    belongs_to :country 
    belongs_to :account_type 

    has_many :authentications 

    validates :email, 
    presence: true, 
    uniqueness: {case_sensitive: false}, 
    format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create } 

    validates :password, 
    presence: true, 
    :on => :create 


    def self.authenticate email, password 
    User.find_by_email(email).try(:authenticate, password) 
    end 

end 

ответ

1

Я задавался в течение длительного времени, чтобы найти проблему:

def change_password 
    @user = User.find(@current_user) 
    current_password = params[:user][:current_password] 
    user = User.authenticate(@user.email, current_password) 
    if @user && user 
    # @user.update.password = params[:new_password] 
    # new_password = params[:password] 
    # @user.update(new_password) 
    user.update_attribute(password: params[:user][:current_password]) 
    flash[:success] = "Password successfully changed!" 
    redirect_to user_path(@current_user) 
    else 
    flash[:danger] = "Your old password was incorrect. Please try again." 
    redirect_to user_path(@current_user) 
    end 
end 

Есть много способов, чтобы обновить данные. Вы можете посмотреть different way to update attribute. Я бы предпочел выбрать update_attribute, потому что в этом случае нам не нужно проверять другое поле. Посмотрите, как update_attribute description. Вы должны удалить @user.save, потому что update_attribute уже сохранил его. Надеюсь, это может вам помочь.

+0

безупречный! Благодаря! – user4889724

+0

Добро пожаловать. :) – akbarbin

Смежные вопросы