{"id":2917,"date":"2021-11-22T20:48:20","date_gmt":"2021-11-22T11:48:20","guid":{"rendered":"https:\/\/suzutukiblog.com\/?p=2917"},"modified":"2022-01-22T09:12:41","modified_gmt":"2022-01-22T00:12:41","slug":"rails-tutorial-8","status":"publish","type":"post","link":"https:\/\/suzutukiblog.com\/index.php\/2021\/11\/22\/rails-tutorial-8\/","title":{"rendered":"Rails-tutorial\u81ea\u5206\u7528\u307e\u3068\u3081(\u7b2c8\u7ae0 \u30ed\u30b0\u30a4\u30f3\u6a5f\u69cb\u3000\u4e3b\u306b\u6f14\u7fd2\u3068\u305d\u306e\u56de\u7b54)"},"content":{"rendered":"<p><a href=\"https:\/\/suzutukiblog.com\/index.php\/2021\/04\/18\/rails-tutorial-7\/\">\u305d\u306e7\u304b\u3089\u7d9a\u304f<\/a><\/p>\n<h2><span class=\"number\">8.1 <\/span>\u30bb\u30c3\u30b7\u30e7\u30f3<\/h2>\n<p>HTTP\u306f<em>\u30b9\u30c6\u30fc\u30c8\u30ec\u30b9 (Stateless) \u306a\u30d7\u30ed\u30c8\u30b3\u30eb<\/em>\u3067\u3059\u3002\u6587\u5b57\u901a\u308a\u300c\u72b6\u614b (state)\u300d\u304c\u300c\u306a\u3044 (less)\u300d\u306e\u3067\u3001HTTP\u306e\u30ea\u30af\u30a8\u30b9\u30c8\uff11\u3064\uff11\u3064\u306f\u3001\u305d\u308c\u3088\u308a\u524d\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u60c5\u5831\u3092\u307e\u3063\u305f\u304f\u5229\u7528\u3067\u304d\u306a\u3044\u3001\u72ec\u7acb\u3057\u305f\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u3068\u3057\u3066\u6271\u308f\u308c\u307e\u3059\u3002<\/p>\n<p>\u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a4\u30f3\u306e\u5fc5\u8981\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001<em>\u30bb\u30c3\u30b7\u30e7\u30f3 (Session)<\/em> \u3068\u547c\u3070\u308c\u308b\u534a\u6c38\u7d9a\u7684\u306a\u63a5\u7d9a\u3092\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u9593 (\u30e6\u30fc\u30b6\u30fc\u306e\u30d1\u30bd\u30b3\u30f3\u306eWeb\u30d6\u30e9\u30a6\u30b6\u3068Rails\u30b5\u30fc\u30d0\u30fc\u306a\u3069) \u306b\u5225\u9014\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>Rails\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u3068\u3057\u3066\u6700\u3082\u4e00\u822c\u7684\u306a\u306e\u306f\u3001<em>cookies<\/em>\u3092\u4f7f\u3046\u65b9\u6cd5\u3067\u3059\u3002cookies\u3068\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30d6\u30e9\u30a6\u30b6\u306b\u4fdd\u5b58\u3055\u308c\u308b\u5c0f\u3055\u306a\u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3067\u3059\u3002<\/p>\n<h3><span class=\"number\">8.1.1 <\/span>Sessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9<\/h3>\n<p>Sessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3092\u751f\u6210\u3059\u308b<\/p>\n<pre>rails generate controller Sessions new<\/pre>\n<div class=\"heading\"><span class=\"description\">\u30ea\u30bd\u30fc\u30b9\u3092\u8ffd\u52a0\u3057\u3066\u6a19\u6e96\u7684\u306aRESTful\u30a2\u30af\u30b7\u30e7\u30f3\u3092get\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b <span class=\"smallcaps\"><strong>red<\/strong><\/span> <code class=\"filepath\">config\/routes.rb<\/code><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><span class=\"no\">Rails<\/span><span class=\"o\">.<\/span><span class=\"n\">application<\/span><span class=\"o\">.<\/span><span class=\"n\">routes<\/span><span class=\"o\">.<\/span><span class=\"n\">draw<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"n\">root<\/span>   <span class=\"s1\">'static_pages#home'<\/span>\r\n  <span class=\"n\">get<\/span>    <span class=\"s1\">'\/help'<\/span><span class=\"p\">,<\/span>    <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'static_pages#help'<\/span>\r\n  <span class=\"n\">get<\/span>    <span class=\"s1\">'\/about'<\/span><span class=\"p\">,<\/span>   <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'static_pages#about'<\/span>\r\n  <span class=\"n\">get<\/span>    <span class=\"s1\">'\/contact'<\/span><span class=\"p\">,<\/span> <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'static_pages#contact'<\/span>\r\n  <span class=\"n\">get<\/span>    <span class=\"s1\">'\/signup'<\/span><span class=\"p\">,<\/span>  <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'users#new'<\/span>\r\n<span class=\"hll\">  <span class=\"n\">get<\/span>    <span class=\"s1\">'\/login'<\/span><span class=\"p\">,<\/span>   <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'sessions#new'<\/span>\r\n<\/span><span class=\"hll\">  <span class=\"n\">post<\/span>   <span class=\"s1\">'\/login'<\/span><span class=\"p\">,<\/span>   <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'sessions#create'<\/span>\r\n<\/span><span class=\"hll\">  <span class=\"n\">delete<\/span> <span class=\"s1\">'\/logout'<\/span><span class=\"p\">,<\/span>  <span class=\"ss\">to<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'sessions#destroy'<\/span>\r\n<\/span>  <span class=\"n\">resources<\/span> <span class=\"ss\">:users<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<pre><span class=\"description\">#\u30bb\u30c3\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0<\/span>\r\nHTTP\u30ea\u30af\u30a8\u30b9\u30c8 URL     \u540d\u524d\u4ed8\u304d\u30eb\u30fc\u30c8 \u30a2\u30af\u30b7\u30e7\u30f3\u540d      \u7528\u9014\r\n<strong>GET          \/login  login_path    new<\/strong>       \u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30da\u30fc\u30b8 (\u30ed\u30b0\u30a4\u30f3)\r\n<strong>POST         \/login  login_path    create<\/strong>    \u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210 (\u30ed\u30b0\u30a4\u30f3)\r\n<strong>DELETE       \/logout logout_path   destroy  <\/strong> \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u524a\u9664 (\u30ed\u30b0\u30a2\u30a6\u30c8)<\/pre>\n<h3>\u6f14\u7fd2<\/h3>\n<p>1:GET login_path\u3068POST login_path\u3068\u306e\u9055\u3044\u3092\u8aac\u660e\u3067\u304d\u307e\u3059\u304b?<br \/>\n\u5c11\u3057\u8003\u3048\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\"><strong>get    '\/login',   to: 'sessions#new'\r\npost   '\/login',   to: 'sessions#create'<\/strong><\/pre>\n<p><b><\/b>GET login_path\uff1a &#8220;\/login&#8221;\u3078\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u969b\u306b&#8221;sessions#new&#8221;\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u5b9f\u884c<\/p>\n<p>POST login_path\uff1a &#8220;sessions#create&#8221;\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u60c5\u5831\u3092&#8221;\/login&#8221;\u3078\u9001\u4fe1\u3002<\/p>\n<p>Get\u306f\/login\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6765\u305f\u969b\u306bsessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306enew\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u3059\u308b\u3068\u3044\u3046\u610f\u5473\u3067Post\u306fsessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306ecreate\u30a2\u30af\u30b7\u30e7\u30f3\u3092\/login\u306b\u9001\u4fe1\u3059\u308b<\/p>\n<p>2:\u30bf\u30fc\u30df\u30ca\u30eb\u306e\u30d1\u30a4\u30d7\u6a5f\u80fd\u3092\u4f7f\u3063\u3066rails routes\u306e\u5b9f\u884c\u7d50\u679c\u3068grep\u30b3\u30de\u30f3\u30c9\u3092\u7e4b\u3050\u3053\u3068\u3067\u3001Users\u30ea\u30bd\u30fc\u30b9\u306b\u95a2\u3059\u308b\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3060\u3051\u3092\u8868\u793a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br \/>\n\u540c\u69d8\u306b\u3057\u3066\u3001Sessions\u30ea\u30bd\u30fc\u30b9\u306b\u95a2\u3059\u308b\u7d50\u679c\u3060\u3051\u3092\u8868\u793a\u3055\u305b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br \/>\n\u73fe\u5728\u3001\u3044\u304f\u3064\u306eSessions\u30ea\u30bd\u30fc\u30b9\u304c\u3042\u308b\u3067\u3057\u3087\u3046\u304b?<\/p>\n<p>rails routes | grep users#<br \/>\nrails routes | grep sessions# \uff13\u3064<\/p>\n<p>form_for(@user)<\/p>\n<p>Rails\u3067\u306f\u4e0a\u306e\u3088\u3046\u306b\u66f8\u304f\u3060\u3051\u3067\u3001<br \/>\n\u300c\u30d5\u30a9\u30fc\u30e0\u306eaction\u306f\/users\u3068\u3044\u3046URL\u3078\u306ePOST\u3067\u3042\u308b\u300d\u3068\u81ea\u52d5\u7684\u306b\u5224\u5b9a\u3057\u307e\u3059\u304c\u3001<br \/>\n\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u5834\u5408\u306f\u30ea\u30bd\u30fc\u30b9\u306e\u540d\u524d\u3068\u305d\u308c\u306b\u5bfe\u5fdc\u3059\u308bURL\u3092\u5177\u4f53\u7684\u306b\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<h3>form_for(:session, url: login_path)<\/h3>\n<h3><span class=\"number\">8.1.2 <\/span>\u30ed\u30b0\u30a4\u30f3\u30d5\u30a9\u30fc\u30e0<\/h3>\n<h2>\u6f14\u7fd2<\/h2>\n<p>\u30ea\u30b9\u30c8 8.4\u3067\u5b9a\u7fa9\u3057\u305f\u30d5\u30a9\u30fc\u30e0\u3067\u9001\u4fe1\u3059\u308b\u3068\u3001Sessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306ecreate\u30a2\u30af\u30b7\u30e7\u30f3\u306b\u5230\u9054\u3057\u307e\u3059\u3002Rails\u306f\u3053\u308c\u3092\u3069\u3046\u3084\u3063\u3066\u5b9f\u73fe\u3057\u3066\u3044\u308b\u3067\u3057\u3087\u3046\u304b?<br \/>\n\u30d2\u30f3\u30c8:\u8868 8.1\u3068\u30ea\u30b9\u30c8 8.5\u306e\uff11\u884c\u76ee\u306b\u6ce8\u76ee\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>action=&#8221;\/login&#8221; method=&#8221;post&#8221;\u304b\u3089\/login\u306bPost\u3059\u308b\u5834\u5408<br \/>\nsessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306ecreate\u30a2\u30af\u30b7\u30e7\u30f3\u304c\u5b9f\u884c\u3055\u308c\u308b\u305f\u3081<\/p>\n<div>\n<h3><span class=\"number\">8.1.3 <\/span>\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22\u3068\u8a8d\u8a3c<\/h3>\n<\/div>\n<div class=\"heading\">\u00a0<span class=\"description\">\u30e6\u30fc\u30b6\u30fc\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u898b\u3064\u3051\u3066\u691c\u8a3c\u3059\u308b<strong><code class=\"filepath\">app\/controllers\/sessions_controller.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">SessionsController<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationController<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">new<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">create<\/span>\r\n<span class=\"hll\">    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by<\/span><span class=\"p\">(<\/span><span class=\"ss\">email<\/span><span class=\"p\">:<\/span> <span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:session<\/span><span class=\"o\">][<\/span><span class=\"ss\">:email<\/span><span class=\"o\">].<\/span><span class=\"n\">downcase<\/span><span class=\"p\">)<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"k\">if<\/span> <span class=\"n\">user<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">authenticate<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:session<\/span><span class=\"o\">][<\/span><span class=\"ss\">:password<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n<\/span>      <span class=\"c1\"># \u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a4\u30f3\u5f8c\u306b\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u30da\u30fc\u30b8\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3059\u308b<\/span>\r\n    <span class=\"k\">else<\/span>\r\n      <span class=\"c1\"># \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u4f5c\u6210\u3059\u308b<\/span>\r\n      <span class=\"n\">render<\/span> <span class=\"s1\">'new'<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">destroy<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<p>User\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Password\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 a &amp;&amp; b<br \/>\n\u5b58\u5728\u3057\u306a\u3044\u00a0 \u00a0 \u00a0 \u00a0 \u4f55\u3067\u3082\u3088\u3044 (nil &amp;&amp; [\u30aa\u30d6\u30b8\u30a7\u30af\u30c8]) == false<br \/>\n\u6709\u52b9\u306a\u30e6\u30fc\u30b6\u30fc \u8aa4\u3063\u305f\u30d1\u30b9\u30ef\u30fc\u30c9 (true &amp;&amp; false) == false<br \/>\n\u6709\u52b9\u306a\u30e6\u30fc\u30b6\u30fc \u6b63\u3057\u3044\u30d1\u30b9\u30ef\u30fc\u30c9 (true &amp;&amp; true) == true<\/p>\n<h3>\u6f14\u7fd2<\/h3>\n<p><!--more--><\/p>\n<p>1:Rails\u30b3\u30f3\u30bd\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u3001\u8868 8.2\u306e\u305d\u308c\u305e\u308c\u306e\u5f0f\u304c\u5408\u3063\u3066\u3044\u308b\u304b\u78ba\u304b\u3081\u3066<br \/>\n\u307f\u307e\u3057\u3087\u3046. \u307e\u305a\u306fuser = nil\u306e\u5834\u5408\u3092\u3001\u6b21\u306buser = User.first\u3068\u3057\u305f\u5834\u5408\u3092<br \/>\n\u78ba\u304b\u3081\u3066\u307f\u3066\u4e0b\u3055\u3044\u3002<\/p>\n<p>\u30d2\u30f3\u30c8:!!(user &amp;&amp; user.authenticate(&#8216;foobar&#8217;))<\/p>\n<pre><strong>user = nil<\/strong>\r\n<strong>&gt;&gt; !!(user &amp;&amp; user.authenticate('password00'))<\/strong>\r\n<strong>=&gt; false<\/strong>\r\n<strong>user = User.first<\/strong>\r\n<strong>&gt;&gt; !!(user &amp;&amp; user.authenticate('password00'))<\/strong>\r\n<strong>=&gt; true<\/strong><\/pre>\n<h3>8.1.5 \u30d5\u30e9\u30c3\u30b7\u30e5\u306e\u30c6\u30b9\u30c8<\/h3>\n<pre><strong>rails generate integration_test users_login<\/strong><\/pre>\n<p>1:\u30ed\u30b0\u30a4\u30f3\u7528\u306e\u30d1\u30b9\u3092\u958b\u304f get login_path<br \/>\n2:\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30d5\u30a9\u30fc\u30e0\u304c\u6b63\u3057\u304f\u8868\u793a\u3055\u308c\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/p>\n<p>assert_template &#8216;sessions\/new&#8217;<\/p>\n<p>3:\u308f\u3056\u3068\u7121\u52b9\u306aparams\u30cf\u30c3\u30b7\u30e5\u3092\u4f7f\u3063\u3066\u30bb\u30c3\u30b7\u30e7\u30f3\u7528\u30d1\u30b9\u306bPOST\u3059\u308b<\/p>\n<p>post login_path, params: { session: { email: &#8220;&#8221;,password: &#8220;&#8221;,} }<\/p>\n<p>4:\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30d5\u30a9\u30fc\u30e0\u304c\u518d\u5ea6\u8868\u793a\u3055\u308c\u3001\u30d5\u30e9\u30c3\u30b7\u30e5\u30e1\u30c3\u30bb\u30fc\u30b8\u304c<br \/>\n\u8ffd\u52a0\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/p>\n<p>assert_template &#8216;sessions\/new&#8217;<\/p>\n<p>5:\u5225\u306e\u30da\u30fc\u30b8 (Home\u30da\u30fc\u30b8\u306a\u3069) \u306b\u3044\u3063\u305f\u3093\u79fb\u52d5\u3059\u308b<\/p>\n<p>get root_path<\/p>\n<p>6:\u79fb\u52d5\u5148\u306e\u30da\u30fc\u30b8\u3067\u30d5\u30e9\u30c3\u30b7\u30e5\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/p>\n<p>assert flash.empty?<\/p>\n<p>flash.now\u306b\u7f6e\u304d\u63db\u3048\u307e\u3059\u3002\u5f8c\u8005\u306f\u3001\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u304c\u7d42\u308f\u3063\u3066\u3044\u308b\u30da\u30fc\u30b8\u3067\u7279\u5225\u306b\u30d5\u30e9\u30c3\u30b7\u30e5\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<div class=\"heading\"><span class=\"description\">\u30d5\u30e9\u30c3\u30b7\u30e5\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u6b8b\u7559\u3092\u30ad\u30e3\u30c3\u30c1\u3059\u308b\u30c6\u30b9\u30c8\u00a0<span class=\"smallcaps\"><strong>red<\/strong><\/span><\/span><\/div>\n<div class=\"heading\"><strong><span class=\"description\"><code class=\"filepath\">test\/integration\/users_login_test.rb<\/code><\/span><\/strong><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"nb\">require<\/span> <span class=\"s1\">'test_helper'<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">UsersLoginTest<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActionDispatch<\/span><span class=\"o\">::<\/span><span class=\"no\">IntegrationTest<\/span>\r\n\r\n  <span class=\"nb\">test<\/span> <span class=\"s2\">\"login with invalid information\"<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">get<\/span> <span class=\"n\">login_path<\/span>\r\n    <span class=\"n\">assert_template<\/span> <span class=\"s1\">'sessions\/new'<\/span>\r\n    <span class=\"n\">post<\/span> <span class=\"n\">login_path<\/span><span class=\"p\">,<\/span> <span class=\"ss\">params<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">session<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">email<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"ss\">password<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span>\r\n    <span class=\"n\">assert_template<\/span> <span class=\"s1\">'sessions\/new'<\/span>\r\n    <span class=\"n\">assert_not<\/span> <span class=\"n\">flash<\/span><span class=\"o\">.<\/span><span class=\"n\">empty?<\/span>\r\n    <span class=\"n\">get<\/span> <span class=\"n\">root_path<\/span>\r\n    <span class=\"n\">assert<\/span> <span class=\"n\">flash<\/span><span class=\"o\">.<\/span><span class=\"n\">empty?<\/span>\r\n  <span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\"><span class=\"smallcaps\"><strong>\u30c6\u30b9\u30c8\u3057\u3066red\u306b\u306a\u308b\u3053\u3068\u3092\u78ba\u8a8d<\/strong><\/span><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong>rails test test\/integration\/users_login_test.rb<\/strong><\/pre>\n<\/div>\n<\/div>\n<h2><span class=\"number\">8.2\u00a0<\/span>\u30ed\u30b0\u30a4\u30f3<\/h2>\n<div class=\"heading\"><span class=\"description\">Application\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306bSession\u30d8\u30eb\u30d1\u30fc\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3080<strong><code class=\"filepath\">app\/controllers\/application_controller.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">ApplicationController<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActionController<\/span><span class=\"o\">::<\/span><span class=\"no\">Base<\/span>\r\n  <span class=\"n\">protect_from_forgery<\/span> <span class=\"ss\">with<\/span><span class=\"p\">:<\/span> <span class=\"ss\">:exception<\/span>\r\n<span class=\"hll\">  <span class=\"kp\">include<\/span> <span class=\"no\">SessionsHeler\r\nend<\/span><\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<h3><span class=\"number\">8.2.1\u00a0<\/span><code class=\"tt\">log_in<\/code>\u30e1\u30bd\u30c3\u30c9<\/h3>\n<div class=\"heading\"><span class=\"description\"><code>log_in<\/code>\u30e1\u30bd\u30c3\u30c9<strong><code class=\"filepath\">app\/helpers\/sessions_helper.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">module<\/span> <span class=\"nn\">SessionsHelper<\/span>\r\n\r\n  <span class=\"c1\"># \u6e21\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u3067\u30ed\u30b0\u30a4\u30f3\u3059\u308b<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">log_in<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">)<\/span>\r\n<span class=\"hll\">    <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">id<\/span>\r\n<\/span>  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\">\u30e6\u30fc\u30b6\u30fc\u306b\u30ed\u30b0\u30a4\u30f3\u3059\u308b<strong><code class=\"filepath\">app\/controllers\/sessions_controller.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">SessionsController<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationController<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">new<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">create<\/span>\r\n    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by<\/span><span class=\"p\">(<\/span><span class=\"ss\">email<\/span><span class=\"p\">:<\/span> <span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:session<\/span><span class=\"o\">][<\/span><span class=\"ss\">:email<\/span><span class=\"o\">].<\/span><span class=\"n\">downcase<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"n\">user<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">authenticate<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:session<\/span><span class=\"o\">][<\/span><span class=\"ss\">:password<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n<span class=\"hll\">      <span class=\"n\">log_in<\/span> <span class=\"n\">user<\/span>\r\n<\/span><span class=\"hll\">      <span class=\"n\">redirect_to<\/span> <span class=\"n\">user<\/span>\r\n<\/span>    <span class=\"k\">else<\/span>\r\n      <span class=\"n\">flash<\/span><span class=\"o\">.<\/span><span class=\"n\">now<\/span><span class=\"o\">[<\/span><span class=\"ss\">:danger<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'Invalid email\/password combination'<\/span>\r\n      <span class=\"n\">render<\/span> <span class=\"s1\">'new'<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">destroy<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<h2>\u6f14\u7fd2<\/h2>\n<h3>1:\u6709\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u3067\u5b9f\u969b\u306b\u30ed\u30b0\u30a4\u30f3\u3057\u3001\u30d6\u30e9\u30a6\u30b6\u304b\u3089cookies\u306e\u60c5\u5831\u3092\u8abf\u3079\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u3068\u304d\u3001session\u306e\u5024\u306f\u3069\u3046\u306a\u3063\u3066\u3044\u308b\u3067\u3057\u3087\u3046\u304b?<\/h3>\n<p><em>\u30d2\u30f3\u30c8<\/em>: \u30d6\u30e9\u30a6\u30b6\u3067cookies\u3092\u8abf\u3079\u308b\u65b9\u6cd5\u304c\u5206\u304b\u3089\u306a\u3044? \u4eca\u3053\u305d\u30b0\u30b0\u3063\u3066\u307f\u308b\u3068\u304d\u3067\u3059!\u00a0<span id=\"ex-f3b33f\" class=\"exercise\"><\/span><\/p>\n<div class=\"co8aDb XcVN5d\" role=\"heading\" aria-level=\"3\"><b>Chrome\u3067cookie\u3092\u78ba\u8a8d\u3059\u308b\u306b\u306f\u3001\u300cGoogle Chrome\u306e\u8a2d\u5b9a\u300d\u30a2\u30a4\u30b3\u30f3\u2192\u300c\u8a2d\u5b9a\u300d\u3092\u30af\u30ea\u30c3\u30af\u3002<\/b><\/div>\n<div role=\"heading\" aria-level=\"3\"><\/div>\n<div class=\"RqBzHd\">\n<ol class=\"X5LH0c\">\n<li class=\"TrT0Xe\">\u30da\u30fc\u30b8\u306e\u4e00\u756a\u4e0b\u306b\u3042\u308b\u300c\u8a73\u7d30\u8a2d\u5b9a\u300d\u3092\u30af\u30ea\u30c3\u30af\u3002<\/li>\n<li class=\"TrT0Xe\">\u300c\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u8a2d\u5b9a\u300d\u3092\u30af\u30ea\u30c3\u30af\u3002<\/li>\n<li class=\"TrT0Xe\">\u300c<b>Cookie<\/b>\u300d\u3092\u30af\u30ea\u30c3\u30af\u3002<\/li>\n<li class=\"TrT0Xe\">\u300c\u3059\u3079\u3066\u306e\u00a0<b>Cookie<\/b>\u00a0\u3068\u30b5\u30a4\u30c8\u30c7\u30fc\u30bf\u3092\u8868\u793a\u300d\u3092\u30af\u30ea\u30c3\u30af\u3002<\/li>\n<li class=\"TrT0Xe\">\u30c9\u30e1\u30a4\u30f3\u5225\u306b<b>cookie<\/b>\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/li>\n<\/ol>\n<\/div>\n<p>2:\u5148\u307b\u3069\u306e\u6f14\u7fd2\u8ab2\u984c\u3068\u540c\u69d8\u306b\u3001<code>Expires<\/code>\u306e\u5024\u306b\u3064\u3044\u3066\u8abf\u3079\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div class=\"RqBzHd\">\n<p>1\u3068\u540c\u3058\u624b\u9806\u3067\u898b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<h3><span class=\"number\">8.2.2\u00a0<\/span>\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc<\/h3>\n<p><code>current_user<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3057\u3066\u3001\u30bb\u30c3\u30b7\u30e7\u30f3ID\u306b\u5bfe\u5fdc\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u53d6\u308a\u51fa\u305b\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<div class=\"heading\"><span class=\"description\">\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u542b\u307e\u308c\u308b\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u691c\u7d22\u3059\u308b<strong><code class=\"filepath\">app\/helpers\/sessions_helper.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">module<\/span> <span class=\"nn\">SessionsHelper<\/span>\r\n\r\n  <span class=\"c1\"># \u6e21\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u3067\u30ed\u30b0\u30a4\u30f3\u3059\u308b<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">log_in<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">id<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"c1\"># \u73fe\u5728\u30ed\u30b0\u30a4\u30f3\u4e2d\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u8fd4\u3059 (\u3044\u308b\u5834\u5408)<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">current_user<\/span>\r\n<span class=\"hll\">    <span class=\"k\">if<\/span> <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span>\r\n<\/span><span class=\"hll\">      <span class=\"vi\">@current_user<\/span> <span class=\"o\">||=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by<\/span><span class=\"p\">(<\/span><span class=\"nb\">id<\/span><span class=\"p\">:<\/span> <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"k\">end<\/span>\r\n<\/span>  <span class=\"k\">end\r\nend<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<h2>\u6f14\u7fd2<\/h2>\n<h3>1:Rails\u30b3\u30f3\u30bd\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u3001User.find_by(id: &#8230;)\u3067\u5bfe\u5fdc\u3059\u308b\u30e6\u30fc\u30b6\u30fc<br \/>\n\u304c\u691c\u7d22\u306b\u5f15\u3063\u304b\u304b\u3089\u306a\u304b\u3063\u305f\u3068\u304d\u3001nil\u3092\u8fd4\u3059\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<pre><strong>user = User.find_by(id: 10)<\/strong>\r\n<strong>User Load (0.1ms) SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = ? LIMIT ? [[\"id\", 10], [\"LIMIT\", 1]]<\/strong>\r\n<strong>=&gt; nil<\/strong><\/pre>\n<h3>2:\u5148\u307b\u3069\u3068\u540c\u69d8\u306b\u3001\u4eca\u5ea6\u306f:user_id\u30ad\u30fc\u3092\u6301\u3064session\u30cf\u30c3\u30b7\u30e5\u3092\u4f5c\u6210<br \/>\n\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<p>\u30ea\u30b9\u30c8 8.17\u306b\u8a18\u3057\u305f\u30b9\u30c6\u30c3\u30d7\u306b\u5f93\u3063\u3066\u3001||=\u6f14\u7b97\u5b50\u304c\u3046\u307e\u304f<br \/>\n\u52d5\u304f\u3053\u3068\u3082\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046<\/p>\n<pre><strong>session = {}<\/strong>\r\n<strong>=&gt; {}<\/strong>\r\n<strong>&gt;&gt; session[:user_id] = nil<\/strong>\r\n<strong>=&gt; nil<\/strong>\r\n<strong>&gt;&gt; @current_user ||= User.find_by(id: session[:user_id])<\/strong>\r\n<strong>User Load (0.2ms) SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" IS NULL LIMIT ? [[\"LIMIT\", 1]]<\/strong>\r\n<strong>=&gt; nil<\/strong>\r\n<strong>&gt;&gt; session[:user_id]= User.first.id<\/strong>\r\n<strong>User Load (0.2ms) SELECT \"users\".* FROM \"users\" ORDER BY \"users\".\"id\" ASC LIMIT ? [[\"LIMIT\", 1]]<\/strong>\r\n<strong>=&gt; 1<\/strong>\r\n<strong>&gt;&gt; @current_user ||= User.find_by(id: session[:user_id])<\/strong>\r\n<strong>User Load (0.1ms) SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = ? LIMIT ? [[\"id\", 1], [\"LIMIT\", 1]]<\/strong>\r\n<strong>=&gt; #&lt;User id: 1, name: \"Rails Tutorial\", email: \"example@railstutorial.org\", created_at: \"2020-04-04 01:52:48\", updated_at: \"2020-04-04 01:52:48\", password_digest: \"$2a$10$X1rTgXx2saP84XHMnyVr5cM6iOKD...\"&gt;<\/strong><\/pre>\n<h3><span class=\"number\">8.2.3 <\/span>\u30ec\u30a4\u30a2\u30a6\u30c8\u30ea\u30f3\u30af\u3092\u5909\u66f4\u3059\u308b<\/h3>\n<p>\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u30ea\u30f3\u30af\u3092\u5909\u66f4\u3059\u308b\u65b9\u6cd5\u3068\u3057\u3066\u8003\u3048\u3089\u308c\u308b\u306e\u306f\u3001<br \/>\nERB\u30b3\u30fc\u30c9\u306e\u4e2d\u3067if-else\u6587\u3092\u4f7f\u7528\u3057\u3001<br \/>\n\u6761\u4ef6\u306b\u5fdc\u3058\u3066\u8868\u793a\u3059\u308b\u30ea\u30f3\u30af\u3092\u4f7f\u3044\u5206\u3051\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n<pre><strong>&lt;% if logged_in? %&gt;<\/strong>\r\n<strong># \u30ed\u30b0\u30a4\u30f3\u30e6\u30fc\u30b6\u30fc\u7528\u306e\u30ea\u30f3\u30af<\/strong>\r\n<strong>&lt;% else %&gt;<\/strong>\r\n<strong># \u30ed\u30b0\u30a4\u30f3\u3057\u3066\u3044\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u7528\u306e\u30ea\u30f3\u30af<\/strong>\r\n<strong>&lt;% end %&gt;<\/strong><\/pre>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u3092\u66f8\u304f\u305f\u3081\u306b\u306f\u3001\u8ad6\u7406\u5024\u3092\u8fd4\u3059logged_in?\u30e1\u30bd\u30c3\u30c9\u304c\u5fc5\u8981\u306a\u306e\u3067\u3001\u307e\u305a\u306f\u305d\u308c\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"heading\"><span class=\"description\"><code>logged_in?<\/code>\u30d8\u30eb\u30d1\u30fc\u30e1\u30bd\u30c3\u30c9<strong><code class=\"filepath\">app\/helpers\/sessions_helper.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">module<\/span> <span class=\"nn\">SessionsHelper<\/span>\r\n\r\n  <span class=\"c1\"># \u6e21\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u3067\u30ed\u30b0\u30a4\u30f3\u3059\u308b<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">log_in<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">id<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"c1\"># \u73fe\u5728\u30ed\u30b0\u30a4\u30f3\u4e2d\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u8fd4\u3059 (\u3044\u308b\u5834\u5408)<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">current_user<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span>\r\n      <span class=\"vi\">@current_user<\/span> <span class=\"o\">||=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by<\/span><span class=\"p\">(<\/span><span class=\"nb\">id<\/span><span class=\"p\">:<\/span> <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end\r\n<\/span><\/strong><span class=\"c1\"># \u30e6\u30fc\u30b6\u30fc\u304c\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u3044\u308c\u3070true\u3001\u305d\u306e\u4ed6\u306a\u3089false\u3092\u8fd4\u3059\r\n<\/span><strong><span class=\"k\">  def<\/span> <span class=\"nf\">logged_in?<\/span>\r\n<span class=\"hll\"><span class=\"o\">   !<\/span><span class=\"n\">current_user<\/span><span class=\"o\">.<\/span><span class=\"n\">nil?\r\n<\/span><\/span>  <span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\">\u30ed\u30b0\u30a4\u30f3\u4e2d\u306e\u30e6\u30fc\u30b6\u30fc\u7528\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u30ea\u30f3\u30af\u3092\u5909\u66f4\u3059\u308b<strong><code class=\"filepath\">app\/views\/layouts\/_header.html.erb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"p\">&lt;<\/span><span class=\"nt\">header<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"navbar navbar-fixed-top navbar-inverse\"<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"container\"<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"sample app\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">root_path<\/span><span class=\"p\">,<\/span> <span class=\"nb\">id<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"logo\"<\/span> <span class=\"cp\">%&gt;<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">nav<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">ul<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"nav navbar-nav navbar-right\"<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span><span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Home\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">root_path<\/span> <span class=\"cp\">%&gt;<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span><span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Help\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">help_path<\/span> <span class=\"cp\">%&gt;<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<span class=\"hll\">        <span class=\"cp\">&lt;%<\/span> <span class=\"k\">if<\/span> <span class=\"n\">logged_in?<\/span> <span class=\"cp\">%&gt;<\/span>\r\n<\/span><span class=\"hll\">          <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span><span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Users\"<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'#'<\/span> <span class=\"cp\">%&gt;<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<\/span>          <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"dropdown\"<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">a<\/span> <span class=\"na\">href<\/span><span class=\"o\">=<\/span><span class=\"s\">\"#\"<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"dropdown-toggle\"<\/span> <span class=\"na\">data-toggle<\/span><span class=\"o\">=<\/span><span class=\"s\">\"dropdown\"<\/span><span class=\"p\">&gt;<\/span>\r\n              Account <span class=\"p\">&lt;<\/span><span class=\"nt\">b<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"caret\"<\/span><span class=\"p\">&gt;&lt;\/<\/span><span class=\"nt\">b<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nt\">a<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">ul<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"dropdown-menu\"<\/span><span class=\"p\">&gt;<\/span>\r\n<span class=\"hll\">              <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span><span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Profile\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">current_user<\/span> <span class=\"cp\">%&gt;<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<\/span><span class=\"hll\">              <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span><span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Settings\"<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'#'<\/span> <span class=\"cp\">%&gt;<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<\/span>              <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span> <span class=\"na\">class<\/span><span class=\"o\">=<\/span><span class=\"s\">\"divider\"<\/span><span class=\"p\">&gt;&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n              <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<span class=\"hll\">                <span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Log out\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">logout_path<\/span><span class=\"p\">,<\/span> <span class=\"nb\">method<\/span><span class=\"p\">:<\/span> <span class=\"ss\">:delete<\/span> <span class=\"cp\">%&gt;<\/span>\r\n<\/span>              <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nt\">ul<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<span class=\"hll\">        <span class=\"cp\">&lt;%<\/span> <span class=\"k\">else<\/span> <span class=\"cp\">%&gt;<\/span>\r\n<\/span><span class=\"hll\">          <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span><span class=\"cp\">&lt;%=<\/span> <span class=\"n\">link_to<\/span> <span class=\"s2\">\"Log in\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">login_path<\/span> <span class=\"cp\">%&gt;<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n<\/span><span class=\"hll\">        <span class=\"cp\">&lt;%<\/span> <span class=\"k\">end<\/span> <span class=\"cp\">%&gt;<\/span>\r\n<\/span>      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">ul<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">nav<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n<span class=\"p\">&lt;\/<\/span><span class=\"nt\">header<\/span><span class=\"p\">&gt;<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div>Bootstrap\u306b\u542b\u307e\u308c\u308bCSS\u306e<code>dropdown<\/code>\u30af\u30e9\u30b9\u3084<code>dropdown-menu<\/code>\u306a\u3069\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u30c9\u30ed\u30c3\u30d7\u30c0\u30a6\u30f3\u6a5f\u80fd\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u3001Rails\u306e<code>application.js<\/code>\u30d5\u30a1\u30a4\u30eb\u3092\u901a\u3057\u3066\u3001Bootstrap\u306b\u540c\u68b1\u3055\u308c\u3066\u3044\u308bJavaScript\u30e9\u30a4\u30d6\u30e9\u30ea\u3068jQuery\u3092\u8aad\u307f\u8fbc\u3080\u3088\u3046\u30a2\u30bb\u30c3\u30c8\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306b\u6307\u793a\u3057\u307e\u3059<\/div>\n<div><\/div>\n<div class=\"heading\"><span class=\"description\"><code>application.js<\/code>\u306bBootstrap\u306eJavaScript\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u8ffd\u52a0\u3059\u308b<strong><code class=\"filepath\">app\/assets\/javascripts\/application.js<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"c1\">\/\/= require rails-ujs<\/span>\r\n<span class=\"hll\"><span class=\"c1\">\/\/= require jquery<\/span>\r\n<\/span><span class=\"hll\"><span class=\"c1\">\/\/= require bootstrap<\/span>\r\n<\/span><span class=\"c1\">\/\/= require turbolinks<\/span>\r\n<span class=\"c1\">\/\/= require_tree .<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<h3>\u6f14\u7fd2<\/h3>\n<p>1:\u30d6\u30e9\u30a6\u30b6\u306ecookie\u30a4\u30f3\u30b9\u30da\u30af\u30bf\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u3001\u30bb\u30c3\u30b7\u30e7\u30f3\u7528\u306ecookie\u3092\u524a\u9664\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\u30d8\u30c3\u30c0\u30fc\u90e8\u5206\u306b\u3042\u308b\u30ea\u30f3\u30af\u306f\u975e\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u306e\u3082\u306e\u306b\u306a\u3063\u3066\u3044\u308b\u3067\u3057\u3087\u3046\u304b?<\/p>\n<p>cookie\u3092\u524a\u9664\u3057\u3066\u78ba\u8a8d\u3059\u308b\u3060\u3051<\/p>\n<p>2:\u3082\u3046\u4e00\u5ea6\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u307f\u3066\u3001\u30d8\u30c3\u30c0\u30fc\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u304c\u5909\u308f\u3063\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u305d\u306e\u5f8c\u3001\u30d6\u30e9\u30a6\u30b6\u3092\u518d\u8d77\u52d5\u3055\u305b\u3001\u518d\u3073\u975e\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u306b\u623b\u3063\u305f\u3053\u3068\u3082\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><em>\u6ce8\u610f<\/em>: \u3082\u3057\u30d6\u30e9\u30a6\u30b6\u306e [\u9589\u3058\u305f\u3068\u304d\u306e\u72b6\u614b\u306b\u623b\u3059] \u6a5f\u80fd\u3092\u30aa\u30f3\u306b\u3057\u3066\u3044\u308b\u3068\u3001\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u3082\u5fa9\u5143\u3055\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u3082\u3057\u305d\u306e\u6a5f\u80fd\u3092\u30aa\u30f3\u306b\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u5fd8\u308c\u305a\u306b\u30aa\u30d5\u306b\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046<\/p>\n<p>\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3060\u3051<\/p>\n<h3><span class=\"number\">8.2.4\u00a0<\/span>\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u5909\u66f4\u3092\u30c6\u30b9\u30c8\u3059\u308b<\/h3>\n<ol>\n<li><strong>\u30ed\u30b0\u30a4\u30f3\u7528\u306e\u30d1\u30b9\u3092\u958b\u304f<\/strong><\/li>\n<li><strong style=\"font-size: 0.857143rem;\">\u30bb\u30c3\u30b7\u30e7\u30f3\u7528\u30d1\u30b9\u306b\u6709\u52b9\u306a\u60c5\u5831\u3092post\u3059\u308b<\/strong><\/li>\n<li><strong>\u30ed\u30b0\u30a4\u30f3\u7528\u30ea\u30f3\u30af\u304c\u8868\u793a\u3055\u308c\u306a\u304f\u306a\u3063\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/strong><\/li>\n<li><strong>\u30ed\u30b0\u30a2\u30a6\u30c8\u7528\u30ea\u30f3\u30af\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/strong><\/li>\n<li><strong>\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u7528\u30ea\u30f3\u30af\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/strong><\/li>\n<\/ol>\n<div class=\"heading\"><span class=\"description\">\u30c6\u30b9\u30c8\u7528\u30c7\u30fc\u30bf\u3092\u4f5c\u6210\u3059\u308bfixture\u5411\u3051\u306edigest\u30e1\u30bd\u30c3\u30c9\u3092\u8ffd\u52a0\u3059\u308b<strong><code class=\"filepath\">app\/models\/user.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationRecord<\/span>\r\n  <span class=\"n\">before_save<\/span> <span class=\"p\">{<\/span> <span class=\"nb\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">email<\/span><span class=\"o\">.<\/span><span class=\"n\">downcase<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"n\">validates<\/span> <span class=\"ss\">:name<\/span><span class=\"p\">,<\/span>  <span class=\"ss\">presence<\/span><span class=\"p\">:<\/span> <span class=\"kp\">true<\/span><span class=\"p\">,<\/span> <span class=\"ss\">length<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">maximum<\/span><span class=\"p\">:<\/span> <span class=\"mi\">50<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"no\">VALID_EMAIL_REGEX<\/span> <span class=\"o\">=<\/span> <span class=\"sr\">\/\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z\/i<\/span>\r\n  <span class=\"n\">validates<\/span> <span class=\"ss\">:email<\/span><span class=\"p\">,<\/span> <span class=\"ss\">presence<\/span><span class=\"p\">:<\/span> <span class=\"kp\">true<\/span><span class=\"p\">,<\/span> <span class=\"ss\">length<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">maximum<\/span><span class=\"p\">:<\/span> <span class=\"mi\">255<\/span> <span class=\"p\">},<\/span>\r\n                    <span class=\"nb\">format<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">with<\/span><span class=\"p\">:<\/span> <span class=\"no\">VALID_EMAIL_REGEX<\/span> <span class=\"p\">},<\/span>\r\n                    <span class=\"ss\">uniqueness<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">case_sensitive<\/span><span class=\"p\">:<\/span> <span class=\"kp\">false<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"n\">has_secure_password<\/span>\r\n  <span class=\"n\">validates<\/span> <span class=\"ss\">:password<\/span><span class=\"p\">,<\/span> <span class=\"ss\">presence<\/span><span class=\"p\">:<\/span> <span class=\"kp\">true<\/span><span class=\"p\">,<\/span> <span class=\"ss\">length<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">minimum<\/span><span class=\"p\">:<\/span> <span class=\"mi\">6<\/span> <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"c1\"># \u6e21\u3055\u308c\u305f\u6587\u5b57\u5217\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u8fd4\u3059<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nc\">User<\/span><span class=\"o\">.<\/span><span class=\"nf\">digest<\/span><span class=\"p\">(<\/span><span class=\"n\">string<\/span><span class=\"p\">)<\/span>\r\n<span class=\"hll\">    <span class=\"n\">cost<\/span> <span class=\"o\">=<\/span> <span class=\"no\">ActiveModel<\/span><span class=\"o\">::<\/span><span class=\"no\">SecurePassword<\/span><span class=\"o\">.<\/span><span class=\"n\">min_cost<\/span> <span class=\"p\">?<\/span> <span class=\"no\">BCrypt<\/span><span class=\"o\">::<\/span><span class=\"no\">Engine<\/span><span class=\"o\">::<\/span><span class=\"no\">MIN_COST<\/span> <span class=\"p\">:<\/span>\r\n<\/span><span class=\"hll\">                                                  <span class=\"no\">BCrypt<\/span><span class=\"o\">::<\/span><span class=\"no\">Engine<\/span><span class=\"o\">.<\/span><span class=\"n\">cost<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"no\">BCrypt<\/span><span class=\"o\">::<\/span><span class=\"no\">Password<\/span><span class=\"o\">.<\/span><span class=\"n\">create<\/span><span class=\"p\">(<\/span><span class=\"n\">string<\/span><span class=\"p\">,<\/span> <span class=\"ss\">cost<\/span><span class=\"p\">:<\/span> <span class=\"n\">cost<\/span><span class=\"p\">)<\/span>\r\n<\/span>  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\">\u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a4\u30f3\u306e\u30c6\u30b9\u30c8\u3067\u4f7f\u3046fixture<\/span><\/div>\n<div class=\"heading\"><span class=\"description\"><strong><code class=\"filepath\">test\/fixtures\/users.yml<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"l l-Scalar l-Scalar-Plain\">michael<\/span><span class=\"p p-Indicator\">:<\/span>\r\n  <span class=\"l l-Scalar l-Scalar-Plain\">name<\/span><span class=\"p p-Indicator\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">Michael Example<\/span>\r\n  <span class=\"l l-Scalar l-Scalar-Plain\">email<\/span><span class=\"p p-Indicator\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">michael@example.com<\/span>\r\n  <span class=\"l l-Scalar l-Scalar-Plain\">password_digest<\/span><span class=\"p p-Indicator\">:<\/span> <span class=\"l l-Scalar l-Scalar-Plain\">&lt;%= User.digest('password') %&gt;<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\">\u6709\u52b9\u306a\u60c5\u5831\u3092\u4f7f\u3063\u3066\u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a4\u30f3\u3092\u30c6\u30b9\u30c8\u3059\u308b\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span><strong><code class=\"filepath\"><\/code><\/strong><\/span><\/div>\n<div class=\"heading\"><span class=\"description\"><strong><code class=\"filepath\">test\/integration\/users_login_test.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"nb\">require<\/span> <span class=\"s1\">'test_helper'<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">UsersLoginTest<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActionDispatch<\/span><span class=\"o\">::<\/span><span class=\"no\">IntegrationTest<\/span>\r\n\r\n<span class=\"hll\">  <span class=\"k\">def<\/span> <span class=\"nf\">setup<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"vi\">@user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">users<\/span><span class=\"p\">(<\/span><span class=\"ss\">:michael<\/span><span class=\"p\">)<\/span>\r\n<\/span><span class=\"hll\">  <span class=\"k\">end<\/span>\r\n<\/span>  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"nb\">test<\/span> <span class=\"s2\">\"login with valid information\"<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">get<\/span> <span class=\"n\">login_path<\/span>\r\n    <span class=\"n\">post<\/span> <span class=\"n\">login_path<\/span><span class=\"p\">,<\/span> <span class=\"ss\">params<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">session<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">email<\/span><span class=\"p\">:<\/span>    <span class=\"vi\">@user<\/span><span class=\"o\">.<\/span><span class=\"n\">email<\/span><span class=\"p\">,<\/span>\r\n                                          <span class=\"ss\">password<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'password'<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span>\r\n    <span class=\"n\">assert_redirected_to<\/span> <span class=\"vi\">@user<\/span>\r\n    <span class=\"n\">follow_redirect!<\/span>\r\n    <span class=\"n\">assert_template<\/span> <span class=\"s1\">'users\/show'<\/span>\r\n    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">login_path<\/span><span class=\"p\">,<\/span> <span class=\"ss\">count<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">logout_path<\/span>\r\n    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">user_path<\/span><span class=\"p\">(<\/span><span class=\"vi\">@user<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\"><span class=\"smallcaps\"><strong>\u30c6\u30b9\u30c8\u3057\u3066\u78ba\u8a8dgreen<\/strong><\/span><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong>rails test test\/integration\/users_login_test.rb<\/strong><\/pre>\n<\/div>\n<\/div>\n<h2>\u6f14\u7fd2<\/h2>\n<div class=\"society-note\"><\/div>\n<h3>1:\u8a66\u3057\u306bSession\u30d8\u30eb\u30d1\u30fc\u306e<code>logged_in?<\/code>\u30e1\u30bd\u30c3\u30c9\u304b\u3089<code>!<\/code>\u3092\u524a\u9664\u3057\u3066\u307f\u3066\u3001\u30ea\u30b9\u30c8\u00a0<span class=\"ref\">8.23<\/span>\u304c <span class=\"smallcaps\" style=\"font-size: 1rem;\"><strong>red<\/strong><\/span><span style=\"font-size: 1rem;\">\u306b\u306a\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p>\uff01\u3092\u524a\u9664\u3057\u3066Test<\/p>\n<h3>2:\u5148\u307b\u3069\u524a\u9664\u3057\u305f\u90e8\u5206 (<code>!<\/code>) \u3092\u5143\u306b\u623b\u3057\u3066\u3001\u30c6\u30b9\u30c8\u304c <span class=\"smallcaps\"><strong>green<\/strong><\/span>\u306b\u623b\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<p>\u3082\u3068\u306b\u623b\u3057\u3066Test<\/p>\n<h3><span class=\"number\">8.2.5\u00a0<\/span>\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u6642\u306b\u30ed\u30b0\u30a4\u30f3<\/h3>\n<p>\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u4e2d\u306b\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u306b\u306f\u3001Users\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e<code>create<\/code>\u30a2\u30af\u30b7\u30e7\u30f3\u306b<code>log_in<\/code>\u3092\u8ffd\u52a0\u3059\u308b\u3060\u3051\u3067\u6e08\u307f\u307e\u3059\u3002<\/p>\n<div class=\"heading\"><span class=\"description\">\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u4e2d\u306b\u30ed\u30b0\u30a4\u30f3\u3059\u308b<strong><code class=\"filepath\">app\/controllers\/users_controller.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">UsersController<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationController<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">show<\/span>\r\n    <span class=\"vi\">@user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">find<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:id<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">new<\/span>\r\n    <span class=\"vi\">@user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">create<\/span>\r\n    <span class=\"vi\">@user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">user_params<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"vi\">@user<\/span><span class=\"o\">.<\/span><span class=\"n\">save<\/span>\r\n<span class=\"hll\">      <span class=\"n\">log_in<\/span> <span class=\"vi\">@user<\/span>\r\n<\/span>      <span class=\"n\">flash<\/span><span class=\"o\">[<\/span><span class=\"ss\">:success<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"Welcome to the Sample App!\"<\/span>\r\n      <span class=\"n\">redirect_to<\/span> <span class=\"vi\">@user<\/span>\r\n    <span class=\"k\">else<\/span>\r\n      <span class=\"n\">render<\/span> <span class=\"s1\">'new'<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"kp\">private<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">user_params<\/span>\r\n      <span class=\"n\">params<\/span><span class=\"o\">.<\/span><span class=\"n\">require<\/span><span class=\"p\">(<\/span><span class=\"ss\">:user<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">permit<\/span><span class=\"p\">(<\/span><span class=\"ss\">:name<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:email<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:password<\/span><span class=\"p\">,<\/span>\r\n                                   <span class=\"ss\">:password_confirmation<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div>\n<p>is_logged_in?\u30d8\u30eb\u30d1\u30fc\u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3057\u3066\u304a\u304f\u3068\u4fbf\u5229\u3067\u3059\u3002<br \/>\n\u3053\u306e\u30d8\u30eb\u30d1\u30fc\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u30c6\u30b9\u30c8\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u30e6\u30fc\u30b6\u30fc\u304c\u3042\u308c\u3070true\u3092\u8fd4\u3057\u3001\u305d\u308c\u4ee5\u5916\u306e\u5834\u5408\u306ffalse\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n<p>\u6b8b\u5ff5\u306a\u304c\u3089\u30d8\u30eb\u30d1\u30fc\u30e1\u30bd\u30c3\u30c9\u306f\u30c6\u30b9\u30c8\u304b\u3089\u547c\u3073\u51fa\u305b\u306a\u3044\u3002<br \/>\nsession\u30e1\u30bd\u30c3\u30c9\u306f\u30c6\u30b9\u30c8\u3067\u3082\u5229\u7528\u3067\u304d\u308b\u306e\u3067\u3001\u3053\u308c\u3092\u4ee3\u308f\u308a\u306b\u4f7f\u3044\u307e\u3059\u3002<br \/>\n\u3053\u3053\u3067\u306f\u53d6\u308a\u9055\u3048\u3092\u9632\u3050\u305f\u3081\u3001logged_in?\u306e\u4ee3\u308f\u308a\u306bis_logged_in?\u3092<br \/>\n\u4f7f\u3063\u3066\u3001\u30d8\u30eb\u30d1\u30fc\u30e1\u30bd\u30c3\u30c9\u540d\u304c\u30c6\u30b9\u30c8\u30d8\u30eb\u30d1\u30fc\u3068Session\u30d8\u30eb\u30d1\u30fc\u3067\u540c\u3058\u306b\u306a\u3089\u306a\u3044\u3088\u3046\u306b\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n<h3 class=\"heading\"><span class=\"description\">\u30c6\u30b9\u30c8\u4e2d\u306e\u30ed\u30b0\u30a4\u30f3\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u8ad6\u7406\u5024\u3067\u8fd4\u3059\u30e1\u30bd\u30c3\u30c9<strong><code class=\"filepath\">test\/test_helper.rb<\/code><\/strong><\/span><\/h3>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"no\">ENV<\/span><span class=\"o\">[<\/span><span class=\"s1\">'RAILS_ENV'<\/span><span class=\"o\">]<\/span> <span class=\"o\">||=<\/span> <span class=\"s1\">'test'<\/span>\r\n<span class=\"o\">.<\/span>\r\n<span class=\"o\">.<\/span>\r\n<span class=\"o\">.<\/span>\r\n<span class=\"k\">class<\/span> <span class=\"nc\">ActiveSupport<\/span><span class=\"o\">::<\/span><span class=\"no\">TestCase<\/span>\r\n  <span class=\"n\">fixtures<\/span> <span class=\"ss\">:all<\/span>\r\n\r\n  <span class=\"c1\"># \u30c6\u30b9\u30c8\u30e6\u30fc\u30b6\u30fc\u304c\u30ed\u30b0\u30a4\u30f3\u4e2d\u306e\u5834\u5408\u306btrue\u3092\u8fd4\u3059<\/span>\r\n<span class=\"hll\">  <span class=\"k\">def<\/span> <span class=\"nf\">is_logged_in?<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"o\">!<\/span><span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">].<\/span><span class=\"n\">nil?<\/span>\r\n<\/span><span class=\"hll\">  <span class=\"k\">end<\/span>\r\n<\/span><span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div id=\"code-login_after_signup_test\" class=\"codelisting\" data-tralics-id=\"uid\" data-number=\"8.27\">\n<h3 class=\"heading\"><span class=\"description\">\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u5f8c\u306e\u30ed\u30b0\u30a4\u30f3\u306e\u30c6\u30b9\u30c8\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span><\/span><\/h3>\n<div class=\"heading\"><span class=\"description\"><strong><code class=\"filepath\">test\/integration\/users_signup_test.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"nb\">require<\/span> <span class=\"s1\">'test_helper'<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">UsersSignupTest<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActionDispatch<\/span><span class=\"o\">::<\/span><span class=\"no\">IntegrationTest<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"nb\">test<\/span> <span class=\"s2\">\"valid signup information\"<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">get<\/span> <span class=\"n\">signup_path<\/span>\r\n    <span class=\"n\">assert_difference<\/span> <span class=\"s1\">'User.count'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span> <span class=\"k\">do<\/span>\r\n      <span class=\"n\">post<\/span> <span class=\"n\">users_path<\/span><span class=\"p\">,<\/span> <span class=\"ss\">params<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">user<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nb\">name<\/span><span class=\"p\">:<\/span>  <span class=\"s2\">\"Example User\"<\/span><span class=\"p\">,<\/span>\r\n                                         <span class=\"ss\">email<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"user@example.com\"<\/span><span class=\"p\">,<\/span>\r\n                                         <span class=\"ss\">password<\/span><span class=\"p\">:<\/span>              <span class=\"s2\">\"password\"<\/span><span class=\"p\">,<\/span>\r\n                                         <span class=\"ss\">password_confirmation<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"password\"<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span>\r\n    <span class=\"k\">end<\/span>\r\n    <span class=\"n\">follow_redirect!<\/span>\r\n    <span class=\"n\">assert_template<\/span> <span class=\"s1\">'users\/show'<\/span>\r\n<span class=\"hll\">    <span class=\"n\">assert<\/span> <span class=\"n\">is_logged_in?<\/span>\r\n<\/span>  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/strong><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>\u3053\u308c\u3067\u3001\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u3068\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span>\u306b\u306a\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\n<div id=\"uid\" class=\"codelisting\" data-tralics-id=\"uid\" data-number=\"8.28\">\n<div class=\"heading\">\u00a0<span class=\"description\"><span class=\"smallcaps\"><strong>green<\/strong><\/span><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre>rails test<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"sec-logging_in\" class=\"section\" data-tralics-id=\"cid46\" data-number=\"8.2\">\n<div id=\"sec-login_upon_signup\" class=\"subsection\" data-tralics-id=\"uid\" data-number=\"8.2.5\">\n<div id=\"sec-exercises_login_upon_signup\" class=\"subsubsection\" data-tralics-id=\"uid\" data-number=\"8.2.5.1\">\n<h3>\u6f14\u7fd2<\/h3>\n<div class=\"society-note\"><\/div>\n<p>1:\u30ea\u30b9\u30c8\u00a0<span class=\"ref\">8.25<\/span>\u306e<code>log_in<\/code>\u306e\u884c\u3092\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3059\u308b\u3068\u3001\u30c6\u30b9\u30c8\u30b9\u30a4\u30fc\u30c8\u306f\u00a0<span class=\"smallcaps\"><strong>red<\/strong><\/span>\u00a0\u306b\u306a\u308b\u3067\u3057\u3087\u3046\u304b?\u00a0\u305d\u308c\u3068\u3082\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span>\u00a0\u306b\u306a\u308b\u3067\u3057\u3087\u3046\u304b?\u00a0\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<span id=\"ex-c5176d\" class=\"exercise\"><\/span><\/p>\n<p>RED<\/p>\n<p>2:\u73fe\u5728\u4f7f\u3063\u3066\u3044\u308b\u30c6\u30ad\u30b9\u30c8\u30a8\u30c7\u30a3\u30bf\u306e\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u3001<span class=\"description\"><code class=\"filepath\">app\/controllers\/users_controller.rb<\/code><\/span>\u3092\u307e\u3068\u3081\u3066\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3067\u304d\u306a\u3044\u304b\u8abf\u3079\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u307e\u305f\u3001\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u306e\u524d\u5f8c\u3067\u30c6\u30b9\u30c8\u30b9\u30a4\u30fc\u30c8\u3092\u5b9f\u884c\u3057\u3001\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3059\u308b\u3068\u00a0<span class=\"smallcaps\"><strong>red<\/strong><\/span>\u00a0\u306b\u3001\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3092\u5143\u306b\u623b\u3059\u3068\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span>\u00a0\u306b\u306a\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><em>\u30d2\u30f3\u30c8<\/em>: \u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u5f8c\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3059\u308b\u3053\u3068\u3092\u5fd8\u308c\u306a\u3044\u3088\u3046\u306b\u3057\u307e\u3057\u3087\u3046\u3002\u307e\u305f\u3001\u30c6\u30ad\u30b9\u30c8\u30a8\u30c7\u30a3\u30bf\u306e\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u6a5f\u80fd\u306b\u3064\u3044\u3066\u306f\u300e<em>\u958b\u767a\u57fa\u790e\u7de8: \u30c6\u30ad\u30b9\u30c8\u30a8\u30c7\u30a3\u30bf<\/em>\u300f\u306e\u00a0\u300c\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u6a5f\u80fd\u300d\u306a\u3069\u3092\u53c2\u7167\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<span id=\"ex-2ef552\" class=\"exercise\"><\/span><\/p>\n<p>\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3057\u3066\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3060\u3051<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"sec-logging_out\" class=\"section\" data-tralics-id=\"cid47\" data-number=\"8.3\">\n<h2><span class=\"number\">8.3\u00a0<\/span>\u30ed\u30b0\u30a2\u30a6\u30c8<\/h2>\n<p>\u30ed\u30b0\u30a2\u30a6\u30c8\u306e\u51e6\u7406\u3067\u306f\u3001<span class=\"description\"><code class=\"filepath\">app\/helpers\/sessions_helper.rb<\/code><\/span>\u306e<code>log_in<\/code>\u30e1\u30bd\u30c3\u30c9\u306e\u5b9f\u884c\u7d50\u679c\u3092\u53d6\u308a\u6d88\u3057\u307e\u3059\u3002\u3064\u307e\u308a\u3001\u30bb\u30c3\u30b7\u30e7\u30f3\u304b\u3089\u30e6\u30fc\u30b6\u30fcID\u3092\u524a\u9664\u3057\u307e\u3059<sup id=\"cha-8_footnote-ref-15\" class=\"footnote\"><\/sup>\u3002\u305d\u306e\u305f\u3081\u306b\u306f\u3001\u6b21\u306e\u3088\u3046\u306b<code>delete<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<div class=\"heading\"><span class=\"description\"><code>log_out<\/code>\u30e1\u30bd\u30c3\u30c9<strong><code class=\"filepath\">app\/helpers\/sessions_helper.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">module<\/span> <span class=\"nn\">SessionsHelper<\/span>\r\n\r\n  <span class=\"c1\"># \u6e21\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u3067\u30ed\u30b0\u30a4\u30f3\u3059\u308b<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">log_in<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">session<\/span><span class=\"o\">[<\/span><span class=\"ss\">:user_id<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">id<\/span>\r\n  <span class=\"k\">end<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"c1\"># \u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u30ed\u30b0\u30a2\u30a6\u30c8\u3059\u308b<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">log_out<\/span>\r\n<span class=\"hll\">    <span class=\"n\">session<\/span><span class=\"o\">.<\/span><span class=\"n\">delete<\/span><span class=\"p\">(<\/span><span class=\"ss\">:user_id<\/span><span class=\"p\">)<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"vi\">@current_user<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">nil<\/span>\r\n<\/span>  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div>\u3053\u3053\u3067\u5b9a\u7fa9\u3057\u305f<code>log_out<\/code>\u30e1\u30bd\u30c3\u30c9\u306f\u3001Sessions\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e<code>destroy<\/code>\u30a2\u30af\u30b7\u30e7\u30f3\u3067\u3082\u540c\u69d8\u306b\u4f7f\u3063\u3066\u3044\u304d\u307e\u3059\u3002<\/div>\n<div><\/div>\n<div class=\"heading\"><span class=\"description\">\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u7834\u68c4\u3059\u308b (\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30b0\u30a2\u30a6\u30c8)<strong><code class=\"filepath\"><\/code><\/strong><\/span><\/div>\n<div class=\"heading\"><span class=\"description\"><strong><code class=\"filepath\">app\/controllers\/sessions_controller.rb<\/code><\/strong><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">SessionsController<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationController<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">new<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">create<\/span>\r\n    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"no\">User<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by<\/span><span class=\"p\">(<\/span><span class=\"ss\">email<\/span><span class=\"p\">:<\/span> <span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:session<\/span><span class=\"o\">][<\/span><span class=\"ss\">:email<\/span><span class=\"o\">].<\/span><span class=\"n\">downcase<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"n\">user<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"n\">authenticate<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"o\">[<\/span><span class=\"ss\">:session<\/span><span class=\"o\">][<\/span><span class=\"ss\">:password<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"n\">log_in<\/span> <span class=\"n\">user<\/span>\r\n      <span class=\"n\">redirect_to<\/span> <span class=\"n\">user<\/span>\r\n    <span class=\"k\">else<\/span>\r\n      <span class=\"n\">flash<\/span><span class=\"o\">.<\/span><span class=\"n\">now<\/span><span class=\"o\">[<\/span><span class=\"ss\">:danger<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'Invalid email\/password combination'<\/span>\r\n      <span class=\"n\">render<\/span> <span class=\"s1\">'new'<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">destroy<\/span>\r\n<span class=\"hll\">    <span class=\"n\">log_out<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">redirect_to<\/span> <span class=\"n\">root_url<\/span>\r\n<\/span>  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\">\u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a2\u30a6\u30c8\u306e\u30c6\u30b9\u30c8\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span><\/span><\/div>\n<div class=\"heading\"><strong><span class=\"description\"><code class=\"filepath\">test\/integration\/users_login_test.rb<\/code><\/span><\/strong><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"nb\">require<\/span> <span class=\"s1\">'test_helper'<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">UsersLoginTest<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActionDispatch<\/span><span class=\"o\">::<\/span><span class=\"no\">IntegrationTest<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n  <span class=\"o\">.<\/span>\r\n<span class=\"hll\">  <span class=\"nb\">test<\/span> <span class=\"s2\">\"login with valid information followed by logout\"<\/span> <span class=\"k\">do<\/span>\r\n<\/span>    <span class=\"n\">get<\/span> <span class=\"n\">login_path<\/span>\r\n    <span class=\"n\">post<\/span> <span class=\"n\">login_path<\/span><span class=\"p\">,<\/span> <span class=\"ss\">params<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">session<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">email<\/span><span class=\"p\">:<\/span>    <span class=\"vi\">@user<\/span><span class=\"o\">.<\/span><span class=\"n\">email<\/span><span class=\"p\">,<\/span>\r\n                                          <span class=\"ss\">password<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'password'<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"hll\">    <span class=\"n\">assert<\/span> <span class=\"n\">is_logged_in?<\/span>\r\n<\/span>    <span class=\"n\">assert_redirected_to<\/span> <span class=\"vi\">@user<\/span>\r\n    <span class=\"n\">follow_redirect!<\/span>\r\n    <span class=\"n\">assert_template<\/span> <span class=\"s1\">'users\/show'<\/span>\r\n    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">login_path<\/span><span class=\"p\">,<\/span> <span class=\"ss\">count<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">logout_path<\/span>\r\n    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">user_path<\/span><span class=\"p\">(<\/span><span class=\"vi\">@user<\/span><span class=\"p\">)<\/span>\r\n<span class=\"hll\">    <span class=\"n\">delete<\/span> <span class=\"n\">logout_path<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">assert_not<\/span> <span class=\"n\">is_logged_in?<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">assert_redirected_to<\/span> <span class=\"n\">root_url<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">follow_redirect!<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">login_path<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">logout_path<\/span><span class=\"p\">,<\/span>      <span class=\"ss\">count<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span>\r\n<\/span><span class=\"hll\">    <span class=\"n\">assert_select<\/span> <span class=\"s2\">\"a[href=?]\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">user_path<\/span><span class=\"p\">(<\/span><span class=\"vi\">@user<\/span><span class=\"p\">),<\/span> <span class=\"ss\">count<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span>\r\n<\/span>  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<div class=\"heading\"><span class=\"description\"><span class=\"smallcaps\"><strong>\u30c6\u30b9\u30c8\u3057\u3066\u78ba\u8a8dgreen<\/strong><\/span><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong>rails test<\/strong><\/pre>\n<\/div>\n<\/div>\n<h2>\u6f14\u7fd2<\/h2>\n<p>1:\u30d6\u30e9\u30a6\u30b6\u304b\u3089 [Log out] \u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30af\u3057\u3001\u3069\u3093\u306a\u5909\u5316\u304c\u8d77\u3053\u308b\u304b\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u307e\u305f\u3001<span class=\"description\"><code class=\"filepath\">test\/integration\/users_login_test.rb<\/code><\/span>\u3067\u5b9a\u7fa9\u3057\u305f\uff13\u3064\u306e\u30b9\u30c6\u30c3\u30d7\u3092\u5b9f\u884c\u3057\u3066\u307f\u3066\u3001\u3046\u307e\u304f\u52d5\u3044\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3060\u3051<\/p>\n<p>2:cookies\u306e\u5185\u5bb9\u3092\u8abf\u3079\u3066\u307f\u3066\u3001\u30ed\u30b0\u30a2\u30a6\u30c8\u5f8c\u306b\u306fsession\u304c\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>cookies\u306e\u4e2d\u8eab\u3092\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u898b\u308b\u3060\u3051<\/p>\n<h3>8\u7ae0\u306e\u307e\u3068\u3081<\/h3>\n<h4>1:Rails\u306esession\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3046\u3068\u3001\u3042\u308b\u30da\u30fc\u30b8\u304b\u3089\u5225\u306e\u30da\u30fc\u30b8\u306b\u79fb\u52d5<br \/>\n\u3059\u308b\u3068\u304d\u306e\u72b6\u614b\u3092\u4fdd\u6301\u3067\u304d\u308b\u3002\u4e00\u6642\u7684\u306a\u72b6\u614b\u306e\u4fdd\u5b58\u306b\u306fcookies\u3082\u4f7f\u3048\u308b<\/h4>\n<h4>2:\u30ed\u30b0\u30a4\u30f3\u30d5\u30a9\u30fc\u30e0\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u305f\u3081\u306e\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3<br \/>\n\u304c\u4f5c\u6210\u3067\u304d\u308b<\/h4>\n<h4>3:flash.now\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3046\u3068\u3001\u63cf\u753b\u6e08\u307f\u306e\u30da\u30fc\u30b8\u306b\u3082\u30d5\u30e9\u30c3\u30b7\u30e5\u30e1\u30c3\u30bb\u30fc\u30b8<br \/>\n\u3092\u8868\u793a\u3067\u304d\u308b<\/h4>\n<h4>4:\u30c6\u30b9\u30c8\u99c6\u52d5\u958b\u767a\u306f\u3001\u56de\u5e30\u30d0\u30b0\u3092\u9632\u3050\u3068\u304d\u306b\u4fbf\u5229<\/h4>\n<h4>5:session\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3046\u3068\u3001\u30e6\u30fc\u30b6\u30fcID\u306a\u3069\u3092\u30d6\u30e9\u30a6\u30b6\u306b\u4e00\u6642\u7684\u306b\u4fdd\u5b58\u3067\u304d\u308b<\/h4>\n<h4>6:\u30ed\u30b0\u30a4\u30f3\u306e\u72b6\u614b\u306b\u5fdc\u3058\u3066\u3001\u30da\u30fc\u30b8\u5185\u3067\u8868\u793a\u3059\u308b\u30ea\u30f3\u30af\u3092\u5207\u308a\u66ff\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u308b<\/h4>\n<h4>7:\u7d71\u5408\u30c6\u30b9\u30c8\u3067\u306f\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u66f4\u65b0\u3001\u30ec\u30a4\u30a2\u30a6\u30c8\u306e\u5909\u66f4\u304c\u6b63\u3057\u304f\u884c\u308f\u308c\u3066\u3044\u308b\u304b\u3092\u78ba\u8a8d\u3067\u304d\u308b<\/h4>\n<p><a href=\"https:\/\/suzutukiblog.com\/index.php\/2021\/04\/20\/rails-tutorial-9\/\">\u305d\u306e9\u306b\u7d9a\u304f<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u305d\u306e7\u304b\u3089\u7d9a\u304f 8.1 \u30bb\u30c3\u30b7\u30e7\u30f3 HTTP\u306f\u30b9\u30c6\u30fc\u30c8\u30ec\u30b9 (Stateless) \u306a\u30d7\u30ed\u30c8\u30b3\u30eb\u3067\u3059\u3002\u6587\u5b57\u901a\u308a\u300c\u72b6\u614b (state)\u300d\u304c\u300c\u306a\u3044 (less)\u300d\u306e\u3067\u3001HTTP\u306e\u30ea\u30af\u30a8\u30b9\u30c8\uff11\u3064\uff11\u3064\u306f\u3001\u305d\u308c\u3088\u308a\u524d\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306e [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2764,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[27,13],"tags":[],"class_list":["post-2917","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming-note","category-rails"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/2917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/comments?post=2917"}],"version-history":[{"count":12,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/2917\/revisions"}],"predecessor-version":[{"id":4535,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/2917\/revisions\/4535"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/media\/2764"}],"wp:attachment":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/media?parent=2917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/categories?post=2917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/tags?post=2917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}