やっとこさActiveRecord_session_storeへ
昨日は地獄だった・・・。RailsでActiveRecord-session_store入れた際にmysql2の別バージョンを誤ってインスコしてしまい、慌てて削除したら間違って元々動かしていたMySQLのアダプタ(コネクタ)消しちまったんだもん。
そして、こっちの記事で「うまく行ったぜー!」と思ってたことが若干間違っていたし。(なので、少し書き直しました。)
まぁさんざ悩んだ挙句、なんとかMySQLのアダプタ(コネクタ)の復旧も終わり、やっとこさActiveRecord-session_sotreへ。
もうちょっとまとめてから書こうと思ったけど、昨日の件を思い出して、もう思い立ったときにまとめておいたほうがいいかなって。
さっそくActiveRecord-session_storeのインストールから。
アプリ側のGemfileに以下を記述。
gem 'activerecord-session_store'
で、コイツをコマンドラインからbudle installする。
Gemfileにmysql2の指定が入っていて、かつ俺みたいな開発環境が窓の人はこのときにmysql2のプレーンなアダプタがインストールされてしまうので、コメントアウトなりbundle install終わったら消すなりで対処してね。でも俺みたいに慌てて消すとコネクタ導入の惨劇が起こる。注意。
で、これでActiveRecord-session_storeのインストール終わり!cattlemuteの次回の記事にご期待下s・・・まだ続くよ!!
インストール完了後、早速コマンドを実行する。
ネットで調べていると、「config/initializers/session_store.rb」ってファイルを設定していたりするみたいだったけど、俺の環境では見つからなかった。
でも余計なことしてまた変なトラブルになるのも嫌だからとりあえずコマンドをそのまま実行。
これでそのまま通れば無問題。
rails generate active_record:session_migration
ほい。普通に行けました。
きちんとdb/migrateの中に「【日付】_add_sessions_table.rb」が作成されています。そして、rake db:migrate。
StandardError: An error has occurred, all later migrations canceled:
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:
\(^o^)/
はい、マイグレーションしようとしたらエラー出ました。
「ActiveRecord::Migrationの直接の継承は無理だから!Railsがリリースしているマイグレーションをきちんと指定せえよ!」的なことが事が書かれている。
ああ、「【日付】_add_sessions_table.rb」のここね。
class AddSessionsTable < ActiveRecord::Migration #←これ ~~~ end
これをこう書き直す。
class CreateCkeditorAssets < ActiveRecord::Migration[5.1] ~~~ end
5.1ってのはRailsのバージョン。バージョンを付けておかないとダメ。
これで再度マイグレーションするときちんと通り、sessionsテーブルがMySQLの中に作成されているのが確認できた。
で、冒頭で言っていた「config/initializers/session_store.rb」の話。
どうやらこいつは名前のごとくセッションの保存様式を指定するファイルみたいだ。
なくても行けるんじゃね?と思って試したけど案の定エラーしまくった。
広義でバージョン違いって廃止されるファイルとかもあるから、無いファイルを作成するのは少し気が引けた。
でもそうも言ってられないので作成して、空っぽのファイルの中に以下の設定を書き込んだ。
Rails.application.config.session_store :active_record_store, :key => '_app_session'
_app_sessionはきちんと「_【アプリ名】_session」としておくこと。アプリ名にハイフンが含まれる場合はここでの指定は当該箇所をアンダーバーに変更する。
(ActiveRecord-session_storeなしのCookieのときもなんかそうやって保存してるっぽかったしね。)
そして、先日に作っておいたログイン⇔ログアウト処理でセッションの格納を確認する。
正常な動作をしている場合はログイン画面のアクセス時に、sessionsテーブルにレコードが挿入される。
この際、「id」「session_id」「data」「created_at」「updated_at」にそれぞれ値が入ってくる。この時点で「created_at」「updated_at」は同値。
そして、セッションが更新された際(ログイン・ログアウト時)に、レコードもアップデートされ「updated_at」が変更される・・・という仕組みになっている。
ひとまず、ここまでできればActiveRecord-session_storeは一通りちゃんと使えているはず。
一応、デフォルト以外のカラムを挿入する方法もあるっぽいので、それはユーザー登録・削除・更新の画面のチュートリアルをするときにでも試してみっかと思ってる。
特にユーザーIDは追加しとかないと、セッション数ごとのユーザーがわからないしね。
パスワードのハッシュ化も含めて多分今後のお題目になるね、これ。