Я работаю над учебником Micheal Hartls Rail, я использовал тот же код, но получил другой результат

#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.

Мое предложение состояло бы в том, чтобы дважды проверить, активировал ли ваш пользователь учетную запись, это означало бы нажатие на ссылку активации, прежде чем пытаться сбросить пароль пользователя.

Надеюсь, это поможет, спасибо!