Ruby on Rails Изменить / обновить пароль с модальным на странице профиля Подтвердить старый пароль, добавить новый пароль, подтвердить новый пароль
Я пытаюсь обновить пароль пользователя на странице профиля. Чтобы предоставить вам контекст, пользователь щелкает ссылку "Изменить пароль" на странице своего профиля, которая затем отображает модальное окно с начальной загрузкой_формата для запроса подтверждения старого пароля, ввода нового пароля и подтверждения нового пароля.
В настоящее время у меня есть метод, успешно проходящий, но пароль в базе данных не изменяется. Я не использую 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
Есть много способов обновить данные. Вы можете посмотреть другой способ обновления атрибута. Я бы предпочел выбрать update_attribute, потому что в этом случае нам не нужно проверять другое поле. Посмотрите, как описание update_attribute. Вы должны удалить @user.save
потому что update_attribute уже сохранил его. Надеюсь, это может помочь вам.