#やりたいこと
- 呼ばれているメソッド名を検知して、それをメソッド内部のリファクタリングに利用したい。
#メソッド名検知
-
__method__
: メソッド名をシンボルとして返す。 -
__callee__
: エイリアスメソッド名をシンボルとして返す。
#Refactoring例
- 複数の類似メソッドをalias_methodを利用して一つにまとめる。
- 呼ばれたメソッド名に応じて内部の処理を微調整する。
- Devise+OmniAuthで複数プロバイダ認証(Qiita風)を実装する際にうまく活用できた。
Before
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
set_flash_message(:notice, :success, kind: "Facebook") if is_navigational_format?
sign_in_and_redirect user, event: :authentication
else
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url
end
end
def twitter
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
set_flash_message(:notice, :success, kind: "Twitter") if is_navigational_format?
sign_in_and_redirect user, event: :authentication
else
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url
end
end
end
After
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def callback_for_all_providers
provider = __callee__.to_s # エイリアスメソッド名を読みこみ、文字列として利用。
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
sign_in_and_redirect user, event: :authentication
set_flash_message(:notice, :success, kind: provider.capitalize) if is_navigational_format?
else
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url
end
end
alias_method :twitter, :callback_for_all_providers
alias_method :facebook, :callback_for_all_providers
end