【Rails入門】sessionの使い方まとめ

長瀬来
書いた人 長瀬来
侍エンジニア塾ブログは、未経験からWebアプリ開発と仕事獲得をサポートする
侍エンジニア塾のオウンドメディアです。
プログラミング学習を覗き見

こんにちは! フリーエンジニアの長瀬です。

みなさんはセッションを使っていますか?

セッションはログイン機能を実装するには必須のもので、ログインに成功した後にログイン状態を維持するために使用されます。

この記事では、セッションの使い方について

・ セッションとは

でセッションの役割について解説した後

・セッションを使ってみよう

で実際にRails5でセッションの使い方をわかりやすいサンプルコードとともに学んでいきましょう。

セッションとは

セッションは主にログイン機能に使用されるもので、ログイン状態を持続させるためにあります。

セッションのおかげで、一度ログインした後は登録されたユーザーとしての扱いを受けることができます。

逆に、セッションという仕組みがなければページを移動するたびにログインし直さなければならないことになるので、とても不便です。

ログイン機能の実装には必要なのでRailsでは、あらかじめセッションを実装するために便利なメソッドが用意されていて、簡単に実装することができます。

また、セッションの情報はRails標準では、ブラウザ側のクッキーに保存されるということも覚えておいてください。

セッションを使ってみよう

それでは、実際にセッションの仕組みを使って簡単なログイン機能を実装してみましょう。

実行環境はrails5.1.4で進めていきます。

今回はセッションに焦点を当てて説明しますので、ユーザーを登録する画面は作成しません。
あらかじめご了承ださい。

まずは、ユーザーを登録するためのユーザーモデルを作成します。
ユーザーモデルには、名前とパスワードが登録できるようにします。

始めに、パスワードを暗号化するためのgemを追加します。

Gemfileに以下の行をコメントアウトしてください。

bcryptというgemを使えば、データベースにパスワードを保存する際に、暗号化してくれます。

コメントアウトが完了したら、コマンドプロンプトで

と入力して、gemのインストールを完了してください。

それでは次にgenerateコマンドを使って、Userモデルを作成します。

コマンドプロンプトに以下のコマンドを入力してくたざい。

実行結果

password_digestというカラムには暗号化されバスワードが入ります。
この名前はbcryptの仕様です、この名前にすると暗号化されて保存されるようになります。

migrationファイルが作成されたので、以下のコマンドを入力してデータベースに反映してください。

実行結果

これでユーザーモデルの作成は完了です。

次に、作成したapp/models/user.rbにパスワードの暗号化を有効にするための設定を加えます。

[app/models/user.rb]

次に、実際にユーザーを登録します。

この登録されたユーザー情報を使って、ログインを実装するためです。

rails cでコンソールを開いた後に、以下のコードを入力してください。

実行結果

コンソールには表形式で表示されるようにHirbというgemを使用しています。
まだ、設定したことのない方はこちらの記事を参考にしてください。

それでは、ユーザーも登録できたので、ログイン画面を作成していきましょう。

generateコマンドを使って、一気に必要なファイルを作成します。

コマンドプロントに以下のコードを入力してください。

実行結果

では、必要なファイルは揃ったので、まずはコントローラーからコードを入力していきましょう。

app/controllers/sessions_controller.rbを開いて、以下のようにコードを修正してください。

何が書いてあるかよくわからないので、コードの解説をします。

まず、

の部分で、ログインボタンを押した後に、セッションに情報が保存されるかを判断しています。

params[:name]で、ユーザーがポストした値を取り出し、その後find_by_nameメソッドで、入力したnameとカラムに保存されたnameが一致した場合にユーザーに代入にしています。

今回はレコードは登録した1つしかないので、コンソール出力されたものが代入されます。

次に、

では&&を使って、条件を2つ指定しています。
userで、userの中身があるのかどうかを判断し、user.authenticateでは今回userに代入されたレコードのパスワードがユーザーがポストした値と一致しているのか判断しています。

もしも、パスワードが一致していなかったら、falseを返します。

そして、パスワードが登録されたユーザー情報と一致したら

で、セッションにユーザー名を登録しています。

session[:名前] はRailsにあらさじめ組み込まれているメソッドで、名前をつけて、セッションに登録できます。

たったこれだけのメソッドで、簡単にセッションの設定ができます。

また、else以降

でセッションを破棄しています。

そしてここまで説明すれば、前半の

の部分のコードを説明できます。

この部分では

で、ログインされているかを判断して、ログインされていたらインスタンス変数noticeを定義しています。

それでは、次にログイン画面を作成していきましょう。

先ほど作成されたapp/views/sessions/index.html.erbを開いて以下のように修正してください。

form_withメソッドで、入力フォームを作成しています。

また、sessions_index_pathでポスト先を指定してるので、ポスト用のルーティングを指定してあげる必要があります。

なのでconfig/routes.rbを開いて,以下のようにルーティングを修正してください。

これで、コントローラーとビューの設定が完了しました。

では、実際にログインして、セッションがうまく機能している確認しましょう。

コマンドプロンプトにrails sと入力して、サーバーを起動してください。

そして、ルーティングに従って、

http://localhost:3000/sessions/index

(補足http://localhost:3000の箇所は各自の開発環境により読み替えてください。)

にアクセスしてください。

Screen Shot 2560-09-19 at 21.16.40

ここにさきほど登録したnameとpasswordを入力してください。
(nameはsamuraiで、passwordはtestです)

Screen Shot 2560-09-19 at 21.17.31

ログインボタンを押すとコントローラーのところで説明したコードに従って、セッション情報が登録されます。

ログインが成功していたら、ページを更新すると

Screen Shot 2560-09-19 at 21.21.34

このように、@noticeに定義した値が出力されます。
@noticeにはセッション情報が使用されているので、セッションが成功していることを確認できました。

まとめ

いかがでしたでしょうか?

この記事では、セッションの使い方を解説しました。

ログイン機能を実装するにはセッションの扱い方を知っておく必要があります。

またRails標準ではブラウザ側のクッキーにセッションの情報は保存されますが、保存先を変更することもできるので興味があるかたは調べてみてください。

もしセッションの使い方について忘れてしまったらこの記事を確認してくださいね!


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


未経験者でも安心の徹底サポート!まずは完全無料の体験レッスン!

「プログラミングに興味があるけど未経験だし、、、」とお悩みの方はご安心ください。

  • 24時間質問し放題
  • あなただけのオーダーメイドカリキュラムで学習の効率化
  • 仕事獲得方法からオリジナルアプリ開発方法

侍エンジニア塾では徹底したサポートによる「オーダーメイドカリキュラム」を作成しています。

まずは無料体験レッスンで、「挫折しない学習方法」や「あなただけの学習ロードマップ」を知り、学習の効率化をしましょう。独学の難点である「オリジナルアプリの作り方やエラーの対処法」についてもアドバイスさせていただきます。

詳しいサービス内容は、下記よりご参照ください。

cta_mtm1

非常識な結果を出した卒業生

活躍する現役エンジニア

人気記事セレクション

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。