Twilio 短信忘记密码 Rails
Twilio SMS Forgotten Password Rails
当用户在登录屏幕上单击 "Forgot My Password" 时,他们将被重定向到路由“/password-reset”。现在,我正在尝试了解如何正确输入您的电子邮件以使用代码接收来自 Twilio 的短信。
<div class="form-group", style="width:50%;">
<%= form_for @user, url: password_patch_path(current_user) do |f| %>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, class: "form-control" %>
</div>
<%= f.submit "Get Confirmation Code", class: "btn btn-default" %>
<% end %>
</div>
我 运行 遇到的问题是 @user 为 nil,我不确定表单开头的 url 是否正确。 @user 为 nil 对我来说很有意义,因为没有人登录,所以我不确定那应该是什么。
我的路线是
get '/password-reset', :to => 'passwords#edit', as: :password_reset
post '/password-reset', :to => 'passwords#reset', as: :password_edit
patch '/password-confirmation', :to => 'passwords#update', as: :password_patch
我的密码控制器看起来像
class PasswordsController < ApplicationController
before_action :authenticated?, only: [:edit, :update]
def reset
ConfirmationSender.send_confirmation_to(current_user)
redirect_to new_confirmation_path
end
def edit
@user = current_user
end
def update
if passwords_not_empty? && passwords_equal?
current_user.update(password_params)
redirect_to users_dashboard_path(current_user.username), success: "Password Updated"
session[:authenticated] = false
else
redirect_to password_edit_path(current_user.username), warning: "Error, please try again."
end
end
private
def password_params
params.require(:user).permit(:password, :password_confirmation)
end
def passwords_not_empty?
params[:user][:password].length > 0 && params[:user][:password_confirmation].length > 0
end
def passwords_equal?
params[:user][:password] == params[:user][:password_confirmation]
end
def authenticated?
render :file => "#{Rails.root}/public/404.html", :status => 404 unless session[:authenticated]
end
end
你是对的,如果用户忘记了 his/her 密码,就不会有 current_user
。我会重新设计如下:
密码控制器
class PasswordsController < ApplicationController
before_action :authenticated?, only: [:update]
def reset
@user = User.find_by(email: params[:user][:email])
if @user.present?
ConfirmationSender.send_confirmation_to(@user)
redirect_to new_confirmation_path
else
redirect_to password_reset_path, warning: "Email not found."
end
end
def edit
@user = User.new
end
...
end
表格
<div class="form-group", style="width:50%;">
<%= form_for @user, url: password_edit_path do |f| %>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, class: "form-control" %>
</div>
<%= f.submit "Get Confirmation Code", class: "btn btn-default" %>
<% end %>
</div>
新的 edit
方法为表单添加空白用户。新的 reset
方法通过电子邮件查找用户并在找到用户时发送令牌。如果没有,它会显示电子邮件未找到的闪现消息并重定向回忘记密码的表单。
这也会使表单使用正确的路径来请求密码确认。
当用户在登录屏幕上单击 "Forgot My Password" 时,他们将被重定向到路由“/password-reset”。现在,我正在尝试了解如何正确输入您的电子邮件以使用代码接收来自 Twilio 的短信。
<div class="form-group", style="width:50%;">
<%= form_for @user, url: password_patch_path(current_user) do |f| %>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, class: "form-control" %>
</div>
<%= f.submit "Get Confirmation Code", class: "btn btn-default" %>
<% end %>
</div>
我 运行 遇到的问题是 @user 为 nil,我不确定表单开头的 url 是否正确。 @user 为 nil 对我来说很有意义,因为没有人登录,所以我不确定那应该是什么。
我的路线是
get '/password-reset', :to => 'passwords#edit', as: :password_reset
post '/password-reset', :to => 'passwords#reset', as: :password_edit
patch '/password-confirmation', :to => 'passwords#update', as: :password_patch
我的密码控制器看起来像
class PasswordsController < ApplicationController
before_action :authenticated?, only: [:edit, :update]
def reset
ConfirmationSender.send_confirmation_to(current_user)
redirect_to new_confirmation_path
end
def edit
@user = current_user
end
def update
if passwords_not_empty? && passwords_equal?
current_user.update(password_params)
redirect_to users_dashboard_path(current_user.username), success: "Password Updated"
session[:authenticated] = false
else
redirect_to password_edit_path(current_user.username), warning: "Error, please try again."
end
end
private
def password_params
params.require(:user).permit(:password, :password_confirmation)
end
def passwords_not_empty?
params[:user][:password].length > 0 && params[:user][:password_confirmation].length > 0
end
def passwords_equal?
params[:user][:password] == params[:user][:password_confirmation]
end
def authenticated?
render :file => "#{Rails.root}/public/404.html", :status => 404 unless session[:authenticated]
end
end
你是对的,如果用户忘记了 his/her 密码,就不会有 current_user
。我会重新设计如下:
密码控制器
class PasswordsController < ApplicationController
before_action :authenticated?, only: [:update]
def reset
@user = User.find_by(email: params[:user][:email])
if @user.present?
ConfirmationSender.send_confirmation_to(@user)
redirect_to new_confirmation_path
else
redirect_to password_reset_path, warning: "Email not found."
end
end
def edit
@user = User.new
end
...
end
表格
<div class="form-group", style="width:50%;">
<%= form_for @user, url: password_edit_path do |f| %>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, class: "form-control" %>
</div>
<%= f.submit "Get Confirmation Code", class: "btn btn-default" %>
<% end %>
</div>
新的 edit
方法为表单添加空白用户。新的 reset
方法通过电子邮件查找用户并在找到用户时发送令牌。如果没有,它会显示电子邮件未找到的闪现消息并重定向回忘记密码的表单。
这也会使表单使用正确的路径来请求密码确认。