#ruby-on-rails #passwords #reset
#ruby-on-rails #пароли #Сброс
Вопрос:
Я работаю над учебником Micheal Hartls Rail в главе 12.3. Я использовал тот же код, что и в книге, но код отображает домашнюю страницу вместо формы редактирования.
edit.html.erb
<h1>Reset password</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(model: @user, url: password_reset_path(params[:id]),
local: true) do |f| %>
<%= render 'shared/error_messages' %>
<%= hidden_field_tag :email, @user.email %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit "Update password", class: "btn btn-primary" %>
<% end %>
</div>
</div>
app/controllers/password_resets_controller.rb
before_action :get_user, only: [:edit, :update]
before_action :valid_user, only: [:edit, :update]
def edit
end
private
def get_user
@user = User.find_by(email: params[:email])
end
# Confirms a valid user.
def valid_user
unless (@user amp;amp; @user.activated? amp;amp;
@user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
[![ with these code and pasting the link on my browser, I should get this form but instead I got the home page][1]][1]
[1]: https://i.stack.imgur.com/kikkF.png
Ответ №1:
К сожалению, у меня недостаточно репутации SO, чтобы написать комментарий, вместо этого я использую форму ответа.
# Confirms a valid user.
def valid_user
unless (@user amp;amp; @user.activated? amp;amp;
@user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
Часть вашего кода проверяет 1. Присутствие пользователя, 2. Активацию пользователя, 3. Токен сброса пользователя, записанный в базу данных, чтобы подтвердить, что это действительный запрос на сброс пароля.
Если какая-либо из этих проверок завершается неудачно — ваш контроллер перенаправляет запрос на root_url.
Мое предложение состояло бы в том, чтобы дважды проверить, активировал ли ваш пользователь учетную запись, это означало бы нажатие на ссылку активации, прежде чем пытаться сбросить пароль пользователя.
Надеюсь, это поможет, спасибо!