ログイン & ログアウト機能サンプル
WEBサービスで確実にお世話になるログイン&ログアウト機能のサンプルを作ってみたのでメモします。
Rails 4.25
ruby 2.23
データベース
usersテーブル
こんな感じのテーブルを用意してください。値は何でもいいです。作り方は下記を参照。
id | name | password | |
---|---|---|---|
1 | アラジン | magi@hoge.com | magimagi |
ルーティング
- /config/routes.rb
#ルートにアクセスするとtopコントローラーのindexアクションを呼び出す。 root "top#index" #CRUD操作のnew/create/destroyのみ使用する。リソースが単数形なのに注意。 resource :sessions, only: [:new, :create, :destroy] #個別にルーティングする方法もある。 #get "signin", to: "sessions#new" #post "signin", to: "sessions#create" #delete "signout", to: "sessions#destroy"
個別ルーティングの場合はこうなる。
モデル
- /app/models/user.rb
#クラスメソッド class << self def check(email, password) user = self.find_by(email: email) user_pass = self.find_by(password: password) #変数userとuser_passのidが一致すれば、変数userを返す if user == user_pass user else nil end end end
コントローラー
/app/controllers/top_controller.rb
中身は空で大丈夫です。
/app/controllers/sessions_controller.rb
#ログイン画面を呼び出す為のアクションなので中身は何もない def new end #セッションを取得/ログイン def create #user.rbに書いたクラスメソッドcheckを使う。フォームからの値をparamsメソッドで受け取る。 @user = User.check(params[:session][:email], params[:session][:password]) #@userがtrueなら、@userのnameをハッシュsessionにキー[:name]でセットする。 if @user session[:name] = @user.name #メッセージをハッシュflashにキー[:success]でセットする。 flash[:success] = "ログインに成功しました。" #rootのページに遷移する。 redirect_to root_path else flash.now[:error] = "メールアドレスとパスワードが一致しません。" render "new" end end #セッションを破棄/ログアウト def destroy #session[:name]に入れた値をdeleteメソッドで削除する。 session.delete(:name) redirect_to new_sessions_path #個別ルーティングの場合 #redirect_to signin_path end
ビュー
- /app/views/sessions/new.html.erb
<h1>Sign in</h1> <!-- ログイン失敗のメッセージを出す --> <%= flash[:error] %> <%= form_for(:session, url: sessions_path) do |f| %> <!-- 個別ルーティングの場合 --> <%#= form_for(:session, url: signin_path) do |f| %> <%= f.label :email %> <%= f.text_field :email %> <%= f.label :password %> <%= f.password_field :password %> <%= f.submit "Sign in" %> <% end %>
- /app/views/top/index.html.erb
<!-- ログアウトリンク --> <%= link_to "Log Out", :sessions, method: :delete %> <!-- 個別ルーティングの場合 --> <%# link_to "Log Out", signout_path, method: :delete %> <!-- ログイン成功のメッセージを出す --> <p><%= flash[:success] %></p> <!-- ログインしたユーザーの名前を表示する --> <p>Welcom<%= session[:name] %>さん</p>
とても簡易的ですが、ひとまずログインしたのがどのユーザーかを認識できるようになりました。