Rails 使った開発日誌 - devise によるログインで独自の認証を実装する

Rails 5.2 と devise 4 でユーザ認証を行う際の 独自の認証を実装する。 他のデータベースやAPIでログインできればそれでログインできることにするものである。

SessionsControllercreate メソッド を変更する。 SessionsControllerDevise::SessionsController を継承していて、 create メソッド の中身は super のみとなっている。

def create
  super
end

super は何をやっているのか、 返り値はなんなのか。

Devise::SessionsController

  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end

これをコピーすれば一応同じことはできる。 まずは warden.authenticate!(auth_options) で認証をやっているものと思われる。 ここで resource に値を代入しているわけだが、 そもそも warden.authenticate! はなにをやっているのか。

StackOverFlow によると、 sign_in はクッキーを設定しているらしい。 sign_insign_in_out.rb で定義されている。 set_flash_message! はきっとログイン成功のメッセージを設定しているに違いないので、 warden.authenticate! がどうなっているかわからないと前に進めない。

もしくは warden.authenticate! の前に別のアカウントでの認証を挟んでしまうか。

昔似たようなことを Rails で実現していたのだが、試作品として捨ててしまっていた。

Mac の Finder で隠しファイルを表示する方法

ターミナルで

defaults write com.apple.finder AppleShowAllFiles TRUE

を実行する。 この後、 Finder のアイコンを長押しして、 Relaunch を選ぶ。 すると表示されるようになる。 (killall Finder をやっても表示されるようになるらしい。)

しかしこれをやっても、 IntelliJ IDEA のインタープリタパスで .rvm を選ぶことはできなかった。 シンボリックリンクでも作ったほうが早いのか。

Config で独自の値を設定する方法

Rails 4, 5 から、 config.x という書き方で独自の設定値を config に追加できるようになっている。 (Rails 3 では config.abc = 123 と書けば 各クラス内で Rails.application.config.abc で値が取れていた。)

config.x では、 ハッシュで設定したものでも、 . で繋げて値を取得できる。

config.x.a = {
  b: 1
}

Ruby のエルビス演算子

Ruby にエルビス演算子はないっぽい。 できることなら Kotlin にあるような .? をでハッシュの奥の方までたどり着きたいのだが・・・次のように。

hash[:key1].?[:key2].?[:key3]

source_location

Ruby 2 では、次のようにすると、そのメソッドの記述されている場所が取得できる。

method(:method_name).source_location