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
。ユーザーがURL を通じてemail
確認した後にのみ置き換えられます。new_email
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
。私は本当にここで独自の認証システムを構築したいと思っています:-)