>プログラミングログイン機能を追加2019年7月7日こんにちは、Nanayakuです。今回は、ログイン機能の追加について解説していきます。最後にログインの仕組みHTTPは「ステートレス」と言う特徴があります。これは、1つ1つの通信が独立しており、前回の通信の情報を記憶することが出来ないと言う事です。これでは、ログイン状態を保持しているのは不可能です。実装しようとすると、全てのリクエストでユーザー情報を入力する必要があります。そこで、考えられたので「Cookie」と「Session」と言う技術です。Cookieはユーザーのブラウザにテクストデータ(ユーザー固有の情報)を保存し、接続してから切断するまでログイン状態を保持できます。ブラウザにテキストデータとして残すので、セキュリティの問題があります。Sessionは、サーバー側に情報を保存し、暗号化してクライアント側にCookieとして保存する方法です。Railsでは、このSessionを使用します。セキュリティガイドSessionの実装Sessionを実装には、SessionのコントローラーとViewを作成します。new」のコマンドでnewアクションを持ったSessionsディレクトリを作成します。画像のようにルートを追記します。'sessions#new'getは所得するだけのメソッドなので、ログインのためのフォームへ転送します。'sessions#create'postは作成するメソッドなので、フォームで入力した情報を元にSessionを作成する処理の振り分けます。'sessions#destroy'deleteは削除するメソッドなので、Sessionを削除する処理に振り分けます。まとめるとルーターは、「ログインフォームに移動」「Sessionの作成」「Sessionの削除」の役割のコントローラーに処理を振り分けています。参考コントローラーに振り分けるViewの作成・編集コントローラーを作成した時に、一緒に作成された「sessions/new.html.erb」にログインフォームを作成します。form_for構文は以下のようになります。%>user(登録フォーム)の場合は以下のように、URLを@userで書けました。%>@userで出来たのは、入力されたデータを保存するUserモデルがあったため、Railsが自動的にcreateメソッドへアクセスしました。今回はデータを保存するSessionモデルがないため、オプションでURLを指定しなければなりません。参考Railsドキュメント・form_for8Viewで生成したHTMLをブラウザで表示する登録フォームを作成Topページと登録フォームのログインのリンクを「login_path」にします。コンローラーの設定UsersControllerとSessionsControllerの違いと書くコードの解説をします。Sessionはモデルを持たないため、インスタンス変数の@userに代入する必要がありません。params[:session][:email])これは、フォームから送信されたメールアドレスと一致するユーザーがいるか検索しています。参考Railsドキュメント・find_by登録フォームを作成・paramsuser.authenticate(params[:session][:password])has_secure_passwordをUserモデルに追加したことで、そのオブジェクト内でauthenticateメソッドが使えるようになっています。ハッシュ化した値と、データベース内にあるpassword_digestカラムの値を比較します。チュートリアルつまり、authenticateメソッドはデータベースのパスワードとフォームから送信されたパスワードを比較し、trueかfalseを返します。user.authenticate(params[:session][:password])上記の2つの条件を合わせ、「該当のメールアドレスをもつuserが存在し、かつuserのパスワードが正しい」と言う条件になります。user.idendsessionメソッドは、sessionに暗号化した情報を保存するメソッドです。log_inメソッドでsession[:user_id]にログイン情報を保存しています。ナビゲーションの作成ナビゲーションバーの作成とログイン画面へ遷移するリンクを作成します。「app/helpers/application_helper.rb」と「app/controllers/application_controller.rb」に以下のコードを追記します。logged_in?!current_user.nil?end「||=」は、左辺が未定義または偽なら右辺の値を代入すると言う意味です。これにより、「データベースの中のid」と「sessionに保存されているid」が一致したならば、@current_userにその情報を代入すると言う意味です。使い分けapplication_helperなどのhelperはViewで共通で使用するコードapplication_controllerはcontrollerで共通で使用するコードをそれぞれ指定できます。ログイン状態でであることを表示したい場合、application_helperとapplication_controllerの両方にメソッドを書きます。「app/views/layouts/application.html.erb」と「app/assets/stylesheets/custom.scss」でナビゲーションバーのViewを作成します。ログアウト機能の追加ログアウトは、保存したsession情報を削除することでできます。Sessionsコントローラーにdestroyアクションとlog_outメソッドを追記します。画像の赤枠が追記した部分です。「session.delete(:user_id)」でsessionの中にあるユーザー情報を削除します。この時、インスタンス変数の@current_userの中には、ログインしているユーザー情報が残ったままなのでnilを代入します。destroyアクションはユーザー情報を削除し、Topページに転送して「ログアウトしました」とフィードバックを表示する意味です。Sessionsコントローラーにストロングパラメーターを実装params.require(:session).permit(:email)これは、フォームの情報のemailのみを生成することを意味しており、引数(:email)を渡すことで、フォームのemailのみ取得できる意味です。passwardも同じです。登録フォームを作成した後にやること重複コードの対策ApplicationControllerとApplicationHelperには同じコードが存在するため、どちらかを削除する必要があります。エラーが出て動かなくなるわけではないのですが、Railsの設計思想に反しており、このまま開発を続けた場合支障をきたす可能性があります。helper_methodメソッドは、コントローラで定義されたいくつかのメソッドを明示的に共有して、それらをビューで使用できるようにすることです。Railsでは、helperとhelper_methodの正確な動作は何ですか?共通化したいメソッドが2つあるので以下のような書き方になります。:logged_in?最後に今回作ったアプリをgitにあげました。良かったら見てみて下さい。https://github.com/sabakan789/test.rails備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。VSCodeを使ってMarkdown記法の書類を作成する時、結構つまったので、設定方法と対処法を紹介します。こんにちは、Nanayakuです。今回は、Gitについて解説していきます。その2こんにちは、Nanayakuです。面接対策のため、Twitterで見つけた技術質問の回答を調べていきます。world!)こんにちは、Nanayakuです。world!を表示する方法を解説しようと思います。...写真投稿機能の追加こんにちは、Nanayakuです。今回は、画像投稿機能の追加について解説していきます。boostを受講し、プログラマーへ転職しました。2020年2月からSES企業に入社。boostやプログラミングなど興味があることを発信していきます。AFFINGER5.。