Ruby on Railsのセッション管理とかformとかを断章的に
ログイン⇔ログアウトの処理の基本的なところが一通り理解しきれたのでここで一旦まとメモ。
セッションとかformデータの送信とか本当にPHPのときの反復が如くやる必要があったよ・・・。
セッション管理はまぁどうせログイン後の値の保持だけだから悩むところではないにしろ、Rails独特のformの書き方は少し戸惑った。
とりあえず、まずはセッションの基本から。
最初に言っておく。俺はかーなーりつyRailsのセッション管理は全部Cookieになっているということ。
Railsの場合はDBベースで使用するには、「別途でgemいれや」だってさ。
PHP5.4とかだったら備え付けにMysqlSessionHandlerあるから、チュートリアルの最初からいきなりDBベースのセッション管理できるのにな。
なんか腑に落ちないけどどうせ開発環境だし、DBベース云々ってのは後の後回し。
まずはセッション(Cookie)を保存・破棄して画面に遷移するところからはじめてみようということで。
ログイン時はフォームから送信されたデータを元にしてログイン(ログイン画面→ユーザー管理画面)、ユーザー画面からのログアウト時はパラメータ付きのリンクを踏んだら変身一発ログアウト(ユーザー管理画面→ログイン画面)、そういう動作をそれぞれ想定する。
ログイン時には下記みたいな感じでCookieでセッションを保存してログイン後の画面に遷移させる。
class UsersController < ApplicationController ~~~ def login post_data = params[【ユーザーIDとパスワードを内包したフォームのデータ】] user_data = 【ユーザーIDとパスワード管理のモデル】.find_by(:【ユーザーID(モデル側)】 => 【ユーザーID(フォーム側)】) if 【post_dataとuser_dataでパスワードの照合】 then session['user'] = 【ユーザーID(モデルorフォームどちらでも)】 redirect_to :action => '【ログイン後に遷移する画面】' return end end def user # ログイン後の画面 end ~~~ end
メモなのでもっと簡潔に書きたかった・・・orz
でも、流石にセッション入れて~、遷移して~だけを書いておいても、あとあとどこで何を入れたか忘れたらヤだし。
で、まぁ上記の6行目がセッションを保存しているところ。
session[‘user’]がPHPでいうところの$_SESSION[‘user’]。いわばスーパーグローバル変数。
で、7行目のredirect_toのところはログイン後の遷移画面の指定。
たとえば上みたいに、Usersってコントローラークラスを作成しており、その中にユーザーの情報を表示させるようなuserってメソッドを作っているなら「:action => user」になる。あ、returnはおまじないね。
で、ログアウト時のセッションの破棄と画面遷移は下記のような感じになる。
class UsersController < ApplicationController ~~~ def logout session['user'] = nil redirect_to :action => 【ログアウト後に遷移する画面(コントローラーのパラメータ)】 return end def user # ログイン後の画面 end ~~~ end
PHPだったら同じことするときは文字通り破棄したいのでunset()してるところだが、Railsではnil(=null)を代入する感じで大丈夫みたいだ。
セッションを空にした後は上記だとログイン画面に戻すようにしているが、これを抜いて「ログアウトしました」的な画面を表示させてもいい。
あとはログイン後の画面(userのHTMLテンプレート)に、ログアウト用のリンクとして以下を設置。
<%= link_to 'ログアウト', :controller => 'users', :action => 'logout' %>
これで「<a href=”users/logout”>ログアウト</a>」ってのが設置される。
これで、ログイン後からの一連の処理の部分は作ったのでいよいよform。
正直、Railsデフォルトのフォームについては色々ワケワケメだったので生で書くかと血迷ったけど、今のうちにこの書式に慣れておかないと後々苦労するような気がしたので頑張ってコマネチしました。
ログイン用画面(loginメソッドに対応するHTMLテンプレート)はこんな感じで書く。
<%= form_for @login, :url => {:action => :login} do |f| %> <table> ~~~ </table> <% end %>
はい。Ruby on Railsのリファレンスを見て、form_forの書式を@userのところをそのまま@loginにすげ替えてやってみました。
そして、unknown variablesのエラーがもののみごとに表示されました<(^o^)>
「:url => {action => :login}」はまぁ「<form action=”users/login”>」を指定しているってのはわかる。
けど、form_forの後の@loginってなんぞや???
第一引数のモデルオブジェクトってなんのことぞや。勝手に入るんやないか?というPGの初心者的にありがちな思考が久しぶりに出てきた。
@がついてるからメソッド内の変数ってのは少し考えればわかることだろうにさwww
テーブルを直接参照させるのかと思って「:users」とかやってみたり、モデルをそのままぶち込めるんじゃねぇかと「User」を入れてみたりな。
まぁ結果的にはusersテーブルのモデルであるUserのことを指し示していた。
で、コントローラーのloginメソッドへ追記。
class UsersController < ApplicationController ~~~ def login @login = User.new ~~~ end ~~~ end
はい。この@loginってのは、要はメソッド内変数にモデルの形態を写してこいってことだったんですね。
ちゃんと書いといてよ(´・ω・`)
で、まぁこの一癖あるform_forってのは便利なもんで、モデルに対応したテーブルをベースにinputのフィールドを作れる。
<%= form_for @login, :url => {:action => :login} do |f| %> <table> <tr> <th>ユーザーID</th> <td> <%= f.text_field :user_id %> </td> </tr> <tr> <th>パスワード</th> <td> <%= f.password_field :password %> </td> </tr> </table> <p><%= f.submit :value => 'ログイン', :data => {:disable_with => 'ログイン中'} %></p> <% end %>
上記の「f.text_field :user_id」「f.password_field :password」は@loginで写してきたUserモデルのカラムの書式を反映している様子。
でもこれHTMLのソース見たけど、何かそのままテーブルの内容がinput name=”user[user_id]”みたいに指定されているような気が・・・。
・・・ま、まぁ大丈夫だよね!!最悪、form_tagなんてもんもあるし。
ともあれ、こんな感じが一連のベース。かなりざっくりとした内容だけど、どうせ断章的なもんだからいいや。
あとはコントローラーのloginにログイン後のアクセスがあった際にセッションが残っている時はコントローラーのuserに飛ばしたり、「ユーザーがいねーよ」とか「パスワードちげーよ」的なことを出力したりするためにレスポンスを取ったりとかいろいろ書き足す形になる。
でも、Cookieのみでやるとかやっぱり実用性ねーな。
Cookieはザオリクしたりできるのでセキュリティ的にやばい。
次はこのCookieの処理を外部gem使ってDB管理することかぁ・・・。面倒くさい。