deviseでconfig/initializerファイルが取り込まれるまでの流れ

rails

deviseとか、devise_token_authでconfig/initializer配下のファイルがどうやってdeviseに取り込まれるかについて、興味を持ったので調査しました。

かなり自分のアウトプット用メモみたいになっていますが、configで設定した設定をdeviseに反映させるまでの流れが理解できる様になっていると思いますので、ぜひ参考にしてみてください。

deviseのconfigファイルについて

deviseのconfigファイルは、config/initializers/devise.rbにあります。

Devise.setup do |config|
  config.authentication_keys = [:name]
  config.case_insensitive_keys = [:email]
  config.strip_whitespace_keys = [:email]
  ...
end

config.⚪︎⚪︎⚪︎でdeviseを色々と設定することができるファイルです。

例えば、config.authentication_keysについては、deviseの認証方法を変更するプロパティになっています。上記の様に:nameを設定すると、sign_upで登録する情報に名前を必須項目に設定することができます。

この設定がどうやってdeviseに反映されるの?という部分を今回は調査していきます。

deviseのconfigファイルを読み込んでいる場所

configファイルを読み込んでいる場所を調査する前に、もう一度configファイルを見返してみます。

Devise.setup do |config|
  ...
end

このdo endはブロック構文と呼ばれ、調べるとわかりますが色々な意味がありますね。下記の記事にブロック構文について詳しい説明がありました。

今回は、この中でも「3. オブジェクトの初期化と値の設定」の内容に当たると思います。deviseのソースコードにもこのような初期化ファイルがあるか探してみたところ、deviseのgithubのdevise/lib/devise.rbに記載がありました。

コードを見るとこの様になっています。

module Devise
  
  ...

  mattr_accessor :authentication_keys # 83行目
  @@authentication_keys = [:email]

  ...

  def self.setup # 313行目
    yield self
  end

このファイルによって、self.setupが実行され、@@authentication_keysが変更される様です。このファイルでクラス変数が変更され、deviseの設定が変わっていくわけですね。

memo

@@はクラス変数と呼ばれるもので、クラス内で一意の変数です。

@との違いは、@はインスタンス内でしか使用できませんが、@@は子クラスなどの外からの参照が可能です。今回のように、下記の記載があった場合、

  mattr_accessor :authentication_keys
  @@authentication_keys = [:email]

子クラスから、Devise.authentication_keysとコードを記載することで、親クラスの@@authentication_keysの値にアクセスすることができます。

もう少し詳しく追っていくために、今回@@authentication_keys = [:email]を変更する流れを追っていこうと思います。

configファイルの設定からauthentication_keysが変更される流れ

Devise.setup do |config|
  config.authentication_keys = [:name]
  ...
end

今回、このようにauthentication_keysをnameに変更するとします。

Devise.setupは下記で実行されていましたね。

module Devise  
  def self.setup # 313行目
    yield self
  end

yield selfとなっていますがこのselfというのは、その関数が属しているclassやモジュールのことなので、今回だとmodule Deviseがそれに当たります。

yieldは「他に渡す、譲渡する」という意味があり、Deviseに処理を譲っていることになります(感覚的ですみません)。なので、self.setupで行われている処理は、Deviseモジュールで行われている処理ということになります。

ここで、Devise.setup do |config|に戻ると、Devise.setupの処理はmodule Deviseに移ったので、こちらの処理もDevise moduleで行われている処理になります。

よって、configはDeviseとなり、

Devise.authentication_keys = [:name]

が実際には行われていることになるわけです。

上記のメモでも説明したように、Devise.authentication_keysとすることで、そのモジュール内部のクラス変数にアクセスすることができるので、上記の処理を実施することで、authentication_keysの値を上書きすることができるというわけです。

子クラスから、Devise.authentication_keysとコードを記載することで、親クラスの@@authentication_keysの値にアクセスすることができます。

deviseでconfigファイルの設定が反映されるまでのまとめ

少し感覚的になってしまった表記もありますが、個人的に納得できたので記事にまとめました。

このconfigファイルの設定でdeviseの処理が変更できる流れを知っておくと、deviseをカスタマイズする際に役立つと思います。

deviseのソースコードを理解してよりdeviseの動きについて理解を深めていきたいです。

コメント

タイトルとURLをコピーしました