RAILS - Не понимаю код сброса пароля - PullRequest
0 голосов
/ 06 января 2010

У меня проблемы с пониманием логики приложения с этим кодом сброса пароля, который я нашел ниже в Интернете.

  1. Пользователь получает электронное письмо с ссылка с некоторым кодом сброса.
  2. После нажатия на это они идут к действие ниже называется сбросом
  3. Пользователь найден в БД ссылка на код сброса.
  4. Показана форма для смены пароля и пользователь вводит новый пароль в.

Вот где я запутался.

  1. Когда форма отправлена, действие вызывается снова.
  2. На этот раз в параметрах не будет кода сброса, поэтому пользователь не будет найден @user = nil
  3. На этот раз это пост-запрос, поэтому мы вводим эту часть логики.

Мой вопрос: как этот код может быть действительным, если @user = nil if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])

# app/controllers/users_controller.rb

def reset
  @user = User.find_by_reset_code(params[:reset_code]) unless params[:reset_code].nil?
  if request.post?
    if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])
      self.current_user = @user
      @user.delete_reset_code
      flash[:notice] = "Password reset successfully for #{@user.email}"
      redirect_to root_url
    else
      render :action => :reset
    end
  end
end

<!-- app/views/users/reset.html.erb -->

<%= error_messages_for :user %>

<% form_for :user do |f| -%>
  <p>
    Pick a new password for <span><%= @user.email %></span>
  </p>

  <p>
    <label for="password">Password</label><br />
    <%= f.password_field :password %>
  </p>

  <p>
    <label for="password">Confirm Password</label><br />
    <%= f.password_field :password_confirmation %>
  </p>

  <p>
    <%= submit_tag 'Reset' %>
  </p>
<% end -%>

Ответы [ 4 ]

1 голос
/ 06 января 2010

Мой ответ: код с ошибкой.

Во-первых, код reset_set должен быть передан обратно в контроллер через скрытое поле в форме или параметр в URL.

Во-вторых, если код возврата не передан (как показано), @user будет равен нулю, и вы получите AV. Вам нужно будет добавить пункт охраны вокруг кода:

if !@user
  flash.now[:notice] = "User not found."
elsif request.post?
  ...

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

(Помните, только то, что вы нашли его в сети, не означает, что это правильно и без ошибок).

1 голос
/ 06 января 2010

Я думаю, вы неправильно поняли поток логики. Представление, которое вы предоставили для запроса электронной почты для сброса пароля. Электронное письмо, скорее всего, будет содержать URL для сброса, который будет включать параметр reset_code. Проверьте представление reset.html, чтобы убедиться, что параметр reset_code там обрабатывается.

1 голос
/ 06 января 2010

При отправке формы действие вызывается снова.

Оператор request.post? if проверяет, отправляют ли они форму. Материал внутри него выполняется только в том случае, если форма отправляет запрос POST, в противном случае она будет отображать страницу так, как вы видите.

На этот раз в параметрах не будет кода сброса, поэтому пользователь не будет найден @user = nil

Страница не отображается, поэтому не нужно ничего настраивать для пользователя, она перенаправляет обратно на основной URL, в котором пользователь будет основываться на сеансе или файле cookie, а не на коде сброса.

На этот раз это пост-запрос, поэтому мы вводим эту часть логики.

Хотя я не могу понять, как работает @user.update_attributes, потому что, как вы сказали, в конце этого оператора unless.

1 голос
/ 06 января 2010

Как этот код может быть действительным, если @user = nil

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...