我正在尝试重构update
我的 Rails 操作中的操作,以便users
只有在通过单击我发送给他们的链接确认后才能更改他们自己的电子邮件地址。
class UsersController < ApplicationController
before_filter :authorized_user
def update
current_email = @user.email
new_email = params[:user][:email].downcase.to_s
if @user.update_attributes(params[:user])
if new_email != current_email
@user.change_email(current_email, new_email)
flash[:success] = "Please click on the link that we've sent you."
else
flash[:success] = "User updated."
end
redirect_to edit_user_path(@user)
else
render :edit
end
end
def confirm_email
@user = User.find_by_email_token!(params[:id])
@user.email = @user.new_email
@user.save
end
private
def authorized_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)
end
end
此功能将新电子邮件保存到数据库字段new_email
。email
只有在用户new_email
通过 URL 确认后才会被替换:
class User < ActiveRecord::Base
def change_email(old_email, new_email)
self.email = old_email
self.new_email = new_email.downcase
self.send_email_confirmation_link
end
end
代码部分有效,但我想知道是否有更优雅的方法来做到这一点,可能是通过使用after_save
回调或至少将更多代码移动到模型中。
最好的方法是什么?
谢谢你的帮助!
PS请不要建议Devise
用于此。我真的很想在这里建立自己的身份验证系统:-)