2013年2月8日金曜日

deviseのヘルパーメソッド(user_signed_in?,current_user,user_session)について調べてみたその1 ~API読む編~

今回はdeviseのヘルパーメソッドメソッドについて調べてみます。

事の発端は
はて、devise使ってる時にログインしているユーザのIDとか名前とかセッションに入ってるんだっけ?
⇒入ってるならどうやって取るんだっけ?
⇒なんかそういうヘルパーメソッドあるんじゃなかったっけ?
⇒そもそもそのヘルパーメソッドって何なんだっけ?
というあたりでした。

というわけでdeviseのヘルパーメソッド
  • user_signed_in?
  • current_user
  • user_session
について見てみることにします。

知っておきたいのは以下のあたり。
  • 仕様(何を入れたら何が返るか)
  • どこにいるのか(どのクラスにいるのか)
  • どう使えばいいか
というわけでサーフィンしに行ったですが、探し方が悪いのかあんまりいい感じの結果は出てきませんでした><
せいぜい以下のカンジ。
  • 3つのヘルパーメソッドがあります
  • current_userを使うと現在のユーザ情報が取れます
  • ログインチェックにはuser_signed_in?を使います。
となればオフィシャル(?)ドキュメントを見るしかなかろう、ということで
を見に行きました。

フレーム左部分の

Classes | Methods | Files 
からMethodを選択して、『user_signed_in?』とかで探してみるとなんもない。
うむ、自動生成されてるからプレフィックスがいかんのかもしれんというわけで『signed_in』とかで探してみると…

あったあった、よかったよかった。

で内容は

- (Booleansigned_in?(scope = nil)

Return true if the given scope is signed in session. If no scope given, return true if any scope is signed in. Does not run authentication hooks.
Returns:
  • (Boolean)
とかなので、(いんちき)翻訳すると。

入力:scope(なくてもいい)
出力:
引数で渡されたスコープがログイン済である(is signed in session) or スコープが渡されていない場合は任意のスコープでログインしている ⇒ true
false:それ以外
説明:本メソッドは認証フックを発生させない。

うーん、大体ニュアンスは分かるのだが、スコープという単語の意味がわからないのでメソッドの↑の方を探してみたところ。
Define authentication filters and accessor helpers based on mappings. These filters should be used inside the controllers as before_filters, so you can control the scope of the user who should be signed in to access that specific controller/action. Example:
Roles:
  User
  Admin

Generated methods:
  authenticate_user!  # Signs user in or redirect
  authenticate_admin! # Signs admin in or redirect
  user_signed_in?     # Checks whether there is a user signed in or not
  admin_signed_in?    # Checks whether there is an admin signed in or not
  current_user        # Current signed in user
  current_admin       # Current signed in admin
  user_session        # Session data available only to the user scope
  admin_session       # Session data available only to the admin scope

Use:
  before_filter :authenticate_user!  # Tell devise to use :user map
  before_filter :authenticate_admin! # Tell devise to use :admin map
とか書いてあるので、userスコープ(多分一般ユーザ)とadminスコープ(多分管理者ユーザ)の事だと思う。

つまり使い方としては、userスコープかadminスコープかもしくは何も指定しないで実行すると、該当のスコープに所属するユーザのセッションが張られている(ログインしている)かどうかを判別できる、というカンジだと思う。

なーる。
では current_user は? と思ってさっきのフォームから探してみたのだが無い。
と思ったけど、↑のやつにcurrent_user っているぞ? どうなってんだ?
で、チョットそこを読んでいくと下の方に
というリンクが。
展開してみると。
# File 'lib/devise/controllers/helpers.rb', line 42

def self.define_helpers(mapping) #:nodoc:
  mapping = mapping.name

  class_eval <<-methods data-blogger-escaped-1="" data-blogger-escaped-:="" data-blogger-escaped-__file__="" data-blogger-escaped-__line__="" data-blogger-escaped-authenticate_="" data-blogger-escaped-current_="" data-blogger-escaped-def="" data-blogger-escaped-devise_controller="" data-blogger-escaped-end="" data-blogger-escaped-force="" data-blogger-escaped-if="" data-blogger-escaped-mapping="" data-blogger-escaped-opts.delete="" data-blogger-escaped-opts="" data-blogger-escaped-scope="" data-blogger-escaped-signed_in="" data-blogger-escaped-warden.authenticate=""> :#{mapping})
    end

    def #{mapping}_session
      current_#{mapping} && warden.session(:#{mapping})
    end
  METHODS

  ActiveSupport.on_load(:action_controller) do
    helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session"
  endend


と出てきた。
define_helpers とあるのでそのものズバリメソッドを自動生成(生成という単語は適切では無い気がするが)するメソッドなのだろう。
で見るとたしかに

#{mapping}_signed_in?
current_#{mapping}
#{mapping}_session

という3つのメソッドがあるため、探したかった
  • user_signed_in?
  • current_user
  • user_session
が自動生成されるのだと読み取れる。
が、これ以降のコードの読み解きは現段階ではムズカシイので一旦パスすることにする。
#なんか↑のコード @current_#{mapping} ||= warden.authenticate(:scope => :#{mapping})
だと、ログインしているユーザ全部とれちゃいそうな気がするのだが。。。

というわけで次回は百聞は1実行に如かずということで実際に打ってためしてみよう。
一旦以上。

0 件のコメント:

コメントを投稿