2010-01-06 4 views
0

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

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

Heres где я запутаться.

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

Мой вопрос - Как может этот код никогда не будет действительным, если @user = ноль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 -%> 

ответ

1

Моим ответом было бы то, что это багги код.

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

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

if [email protected] 
    flash.now[:notice] = "User not found." 
elsif request.post? 
    ... 

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

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

1

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

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

+0

спасибо за хедз-ап за неправильный код, я исправил его. Итак, что происходит после того, как форма возвращается к действию сброса. @user будет нулевым. Но это используется в request.post? блок для обновления пользователя. Я не могу понять, как это когда-нибудь будет обновлять пользователя? – robodisco

1

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

+0

Извините, я добавил неправильный взгляд, но теперь я его повторно произвел. После отправки этой формы по умолчанию следует вернуться к действию сброса. Но на этот раз в params нет reset_code, поэтому я все еще не могу понять, как будет работать пользователь user.update_attributes. – robodisco

1

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

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

На этот раз не будет никакого кода сброса в Params так ни один пользователь не будет найден @user = ноль

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

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

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

+0

Точно, как бы это обновление? Ive обновил сообщение, чтобы показать правильное представление для сброса кстати. Не знаю, что-то там что-то меняет. – robodisco

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