{"id":3060,"date":"2021-12-02T08:25:45","date_gmt":"2021-12-01T23:25:45","guid":{"rendered":"https:\/\/suzutukiblog.com\/?p=3060"},"modified":"2022-01-23T05:58:54","modified_gmt":"2022-01-22T20:58:54","slug":"rails-tutorial12-3","status":"publish","type":"post","link":"https:\/\/suzutukiblog.com\/index.php\/2021\/12\/02\/rails-tutorial12-3\/","title":{"rendered":"Rails-tutorial\u306e\u307e\u3068\u308112.3(\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u3092\u30c6\u30b9\u30c8\u3059\u308b \u4e3b\u306b\u6f14\u7fd2)"},"content":{"rendered":"<p><a href=\"https:\/\/suzutukiblog.com\/index.php\/2021\/02\/02\/rails-tutorial-12\/\">12\u7ae0\u304b\u3089\u7d9a\u304f<\/a><\/p>\n<h3><span class=\"number\">12.3.3\u00a0<\/span>\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u3092\u30c6\u30b9\u30c8\u3059\u308b<\/h3>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u3092\u30c6\u30b9\u30c8\u3059\u308b\u624b\u9806\u306f\u3001\u30a2\u30ab\u30a6\u30f3\u30c8\u6709\u52b9\u5316\u306e\u30c6\u30b9\u30c8\u3068\u591a\u304f\u306e\u5171\u901a\u70b9\u304c\u3042\u308a\u307e\u3059\u304c\u3001<br \/>\n\u30c6\u30b9\u30c8\u306e\u5192\u982d\u90e8\u5206\u306b\u306f\u6b21\u306e\u3088\u3046\u306a\u9055\u3044\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u6700\u521d\u306b\u300cforgot password\u300d\u30d5\u30a9\u30fc\u30e0\u3092\u8868\u793a\u3057\u3066\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u9001\u4fe1\u3057\u3001<br \/>\n\u6b21\u306f\u305d\u306e\u30d5\u30a9\u30fc\u30e0\u3067\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<br \/>\n\u5f8c\u8005\u3067\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u7528\u30c8\u30fc\u30af\u30f3\u304c\u4f5c\u6210\u3055\u308c\u3001\u518d\u8a2d\u5b9a\u7528\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u7d9a\u3044\u3066\u3001\u30e1\u30fc\u30eb\u306e\u30ea\u30f3\u30af\u3092\u958b\u3044\u3066\u7121\u52b9\u306a\u60c5\u5831\u3092\u9001\u4fe1\u3057\u3001<\/p>\n<p>\u6b21\u306b\u305d\u306e\u30ea\u30f3\u30af\u304b\u3089\u6709\u52b9\u306a\u60c5\u5831\u3092\u9001\u4fe1\u3057\u3066\u3001\u305d\u308c\u305e\u308c\u304c\u671f\u5f85\u3069\u304a\u308a\u306b\u52d5\u4f5c\u3059\u308b\u3053\u3068\u3092<br \/>\n\u78ba\u8a8d\u3057\u307e\u3059\u3002\u4f5c\u6210\u3057\u305f\u30c6\u30b9\u30c8\u3092\u793a\u3057\u307e\u3059\u3002<br \/>\n\u3053\u306e\u30c6\u30b9\u30c8\u306f\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u3088\u3044\u7df4\u7fd2\u53f0\u306b\u306a\u308a\u307e\u3059\u3088\u3002<\/p>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u306e\u7d71\u5408\u30c6\u30b9\u30c8<br \/>\n<strong>test\/integration\/password_resets_test.rb<\/strong><\/p>\n<pre><strong>require 'test_helper'<\/strong>\r\n\r\n<strong>class PasswordResetsTest &lt; ActionDispatch::IntegrationTest<\/strong>\r\n\r\n<strong>def setup<\/strong>\r\n<strong>  ActionMailer::Base.deliveries.clear<\/strong>\r\n<strong>@user = users(:michael)<\/strong>\r\n<strong>end<\/strong>\r\n\r\n<strong>test \"password resets\" do<\/strong>\r\n<strong> get new_password_reset_path<\/strong>\r\n<strong> assert_template 'password_resets\/new'<\/strong>\r\n<strong> # \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u7121\u52b9<\/strong>\r\n<strong> post password_resets_path, params: { password_reset: { email: \"\" } }<\/strong>\r\n<strong> assert_not flash.empty?<\/strong>\r\n<strong> assert_template 'password_resets\/new'<\/strong>\r\n<strong># \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u6709\u52b9<\/strong>\r\n<strong> post password_resets_path,<\/strong>\r\n<strong> params: { password_reset: { email: @user.email } }<\/strong>\r\n<strong> assert_not_equal @user.reset_digest, @user.reload.reset_digest<\/strong>\r\n<strong> assert_equal 1, ActionMailer::Base.deliveries.size<\/strong>\r\n<strong> assert_not flash.empty?<\/strong>\r\n<strong> assert_redirected_to root_url<\/strong>\r\n<strong># \u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u30d5\u30a9\u30fc\u30e0\u306e\u30c6\u30b9\u30c8<\/strong>\r\n<strong> user = assigns(:user)<\/strong>\r\n<strong># \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u7121\u52b9<\/strong>\r\n<strong> get edit_password_reset_path(user.reset_token, email: \"\")<\/strong>\r\n<strong> assert_redirected_to root_url<\/strong>\r\n<strong># \u7121\u52b9\u306a\u30e6\u30fc\u30b6\u30fc<\/strong>\r\n<strong> user.toggle!(:activated)<\/strong>\r\n<strong> get edit_password_reset_path(user.reset_token, email: user.email)<\/strong>\r\n<strong> assert_redirected_to root_url<\/strong>\r\n<strong> user.toggle!(:activated)<\/strong>\r\n<strong># \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u6709\u52b9\u3067\u3001\u30c8\u30fc\u30af\u30f3\u304c\u7121\u52b9<\/strong>\r\n<strong> get edit_password_reset_path('wrong token', email: user.email)<\/strong>\r\n<strong> assert_redirected_to root_url<\/strong>\r\n<strong># \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3082\u30c8\u30fc\u30af\u30f3\u3082\u6709\u52b9<\/strong>\r\n<strong> get edit_password_reset_path(user.reset_token, email: user.email)<\/strong>\r\n<strong> assert_template 'password_resets\/edit'<\/strong>\r\n<strong> assert_select \"input[name=email][type=hidden][value=?]\", user.email<\/strong>\r\n<strong># \u7121\u52b9\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u78ba\u8a8d<\/strong>\r\n<strong> patch password_reset_path(user.reset_token),<\/strong>\r\n<strong> params: { email: user.email,<\/strong>\r\n<strong> user: { password: \"foobaz\",<\/strong>\r\n<strong> password_confirmation: \"barquux\" } }<\/strong>\r\n<strong> assert_select 'div#error_explanation'<\/strong>\r\n<strong># \u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u7a7a<\/strong>\r\n<strong> patch password_reset_path(user.reset_token),<\/strong>\r\n<strong> params: { email: user.email,<\/strong>\r\n<strong> user: { password: \"\",<\/strong>\r\n<strong> password_confirmation: \"\" } }<\/strong>\r\n<strong> assert_select 'div#error_explanation'<\/strong>\r\n<strong># \u6709\u52b9\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u78ba\u8a8d<\/strong>\r\n<strong> patch password_reset_path(user.reset_token),<\/strong>\r\n<strong> params: { email: user.email,<\/strong>\r\n<strong> user: { password: \"foobaz\",<\/strong>\r\n<strong> password_confirmation: \"foobaz\" } }<\/strong>\r\n<strong> assert is_logged_in?<\/strong>\r\n<strong> assert_not flash.empty?<\/strong>\r\n<strong> assert_redirected_to user<\/strong>\r\n<strong> end<\/strong>\r\n<strong>end<\/strong><\/pre>\n<p><strong>assert_select &#8220;input[name=email][type=hidden][value=?]&#8221;<\/strong><br \/>\n<strong>, user.email<\/strong><\/p>\n<p>\u4e0a\u306e\u30b3\u30fc\u30c9\u306f\u3001input\u30bf\u30b0\u306b\u6b63\u3057\u3044\u540d\u524d\u3001type=&#8221;hidden&#8221;\u3001<br \/>\n\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u3042\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<div class=\"heading\"><span class=\"description\"><span class=\"smallcaps\"><strong>green<\/strong><\/span><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong>rails test<\/strong><\/pre>\n<\/div>\n<\/div>\n<h3>\u6f14\u7fd2<\/h3>\n<p>1:create_reset_digest\u30e1\u30bd\u30c3\u30c9\u306fupdate_attribute\u3092<br \/>\n\uff12\u56de\u547c\u3073\u51fa\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u3053\u308c\u306f\u5404\u884c\u3067\uff11\u56de\u305a\u3064\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3078\u554f\u3044\u5408\u308f\u305b\u3057\u3066\u3044\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u3063\u3066\u3001update_attribute\u306e\u547c\u3073\u51fa\u3057\u3092<br \/>\n\uff11\u56de\u306eupdate_columns\u547c\u3073\u51fa\u3057\u306b\u307e\u3068\u3081\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br \/>\n(\u3053\u308c\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3078\u306e\u554f\u3044\u5408\u308f\u305b\u304c\uff11\u56de\u3067\u6e08\u3080\u3088\u3046\u306b\u306a\u308a\u307e\u3059)\u3002<br \/>\n\u307e\u305f\u3001\u5909\u66f4\u5f8c\u306b\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u3001 green\u306b\u306a\u308b\u3053\u3068\u3082\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>user.rb\r\n(\u524d\u7565)\r\n  <span class=\"synComment\"># \u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u306e\u5c5e\u6027\u3092\u8a2d\u5b9a\u3059\u308b<\/span>\r\n  <span class=\"synPreProc\">def<\/span> <span class=\"synIdentifier\">create_reset_digest<\/span>\r\n    <span class=\"synConstant\">self<\/span>.reset_token = <span class=\"synType\">User<\/span>.new_token\r\n    update_columns(<span class=\"synConstant\">reset_digest<\/span>:  <span class=\"synType\">User<\/span>.digest(reset_token), <span class=\"synConstant\">reset_sent_at<\/span>: <span class=\"synType\">Time<\/span>.zone.now)\r\n  <span class=\"synPreProc\">end<\/span><\/strong><\/pre>\n<p>2:\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u57cb\u3081\u3066\u3001\u671f\u9650\u5207\u308c\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u3067\u767a\u751f\u3059\u308b\u5206\u5c90\u3092\u7d71\u5408\u30c6\u30b9\u30c8\u3067\u7db2\u7f85\u3057\u3066\u307f\u307e\u3057\u3087\u3046(response.body\u306f\u3001<br \/>\n\u305d\u306e\u30da\u30fc\u30b8\u306eHTML\u672c\u6587\u3092\u3059\u3079\u3066\u8fd4\u3059\u30e1\u30bd\u30c3\u30c9\u3067\u3059)\u3002<br \/>\n\u671f\u9650\u5207\u308c\u3092\u30c6\u30b9\u30c8\u3059\u308b\u65b9\u6cd5\u306f\u3044\u304f\u3064\u304b\u3042\u308a\u307e\u3059\u304c\u3001<br \/>\n\u30aa\u30b9\u30b9\u30e1\u3057\u305f\u624b\u6cd5\u3092\u4f7f\u3048\u3070\u3001<br \/>\n\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u672c\u6587\u306b\u300cexpired\u300d\u3068\u3044\u3046\u8a9e\u304c\u3042\u308b\u304b\u3069\u3046\u304b\u3067\u30c1\u30a7\u30c3\u30af\u3067\u304d\u307e\u3059(\u306a\u304a\u3001\u5927\u6587\u5b57\u3068\u5c0f\u6587\u5b57\u306f\u533a\u5225\u3055\u308c\u307e\u305b\u3093)\u3002<\/p>\n<pre><strong>assert_match \/FILL_IN\/i, response.body<\/strong>\r\n<strong>expired<\/strong><\/pre>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>password_resets_test.rb\r\n\r\n(\u524d\u7565)\r\n  test <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">expired token<\/span><span class=\"synSpecial\">\"<\/span> <span class=\"synStatement\">do<\/span>\r\n    get new_password_reset_path\r\n    post password_resets_path,\r\n         <span class=\"synConstant\">params<\/span>: { <span class=\"synConstant\">password_reset<\/span>: { <span class=\"synConstant\">email<\/span>: <span class=\"synIdentifier\">@user<\/span>.email } }\r\n\r\n    <span class=\"synIdentifier\">@user<\/span> = assigns(<span class=\"synConstant\">:user<\/span>)\r\n    <span class=\"synIdentifier\">@user<\/span>.update_attribute(<span class=\"synConstant\">:reset_sent_at<\/span>, <span class=\"synConstant\">3<\/span>.hours.ago)\r\n    patch password_reset_path(<span class=\"synIdentifier\">@user<\/span>.reset_token),\r\n          <span class=\"synConstant\">params<\/span>: { <span class=\"synConstant\">email<\/span>: <span class=\"synIdentifier\">@user<\/span>.email,\r\n                    <span class=\"synConstant\">user<\/span>: { <span class=\"synConstant\">password<\/span>:              <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">foobar<\/span><span class=\"synSpecial\">\"<\/span>,\r\n                            <span class=\"synConstant\">password_confirmation<\/span>: <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">foobar<\/span><span class=\"synSpecial\">\"<\/span> } }\r\n    assert_response <span class=\"synConstant\">:redirect<\/span>\r\n    follow_redirect!\r\n    #\u8ffd\u52a0\r\n    assert_match <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">expired<\/span><span class=\"synSpecial\">\"<\/span>, response.body   \r\n  <span class=\"synStatement\">end<\/span><\/strong><\/pre>\n<p>3:\uff12\u6642\u9593\u7d4c\u3063\u305f\u3089\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u518d\u8a2d\u5b9a\u3067\u304d\u306a\u304f\u3059\u308b\u65b9\u91dd\u306f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u7684\u306b\u597d\u307e\u3057\u3044\u3084\u308a\u65b9\u3067\u3057\u3087\u3046\u3002<br \/>\n\u3057\u304b\u3057\u3001\u3082\u3063\u3068\u826f\u304f\u3059\u308b\u65b9\u6cd5\u306f\u307e\u3060\u3042\u308a\u307e\u3059\u3002<br \/>\n\u4f8b\u3048\u3070\u3001\u516c\u5171\u306e (\u307e\u305f\u306f\u5171\u6709\u3055\u308c\u305f) \u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u304c\u884c\u308f\u308c\u305f\u5834\u5408\u3092\u8003\u3048\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n\u4eee\u306b\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u96e2\u5e2d\u3057\u305f\u3068\u3057\u3066\u3082\u3001\uff12\u6642\u9593\u4ee5\u5185\u3067\u3042\u308c\u3070\u3001\u305d\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306e\u5c65\u6b74\u304b\u3089\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u30d5\u30a9\u30fc\u30e0\u3092<br \/>\n\u8868\u793a\u3055\u305b\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u66f4\u65b0\u3057\u3066\u3057\u307e\u3046\u3053\u3068\u304c\u3067\u304d\u3066\u3057\u307e\u3044\u307e\u3059<br \/>\n(\u3057\u304b\u3082\u305d\u306e\u307e\u307e\u30ed\u30b0\u30a4\u30f3\u6a5f\u69cb\u307e\u3067\u7a81\u7834\u3055\u308c\u3066\u3057\u307e\u3044\u307e\u3059!)\u3002<br \/>\n\u3053\u306e\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306b\u3001\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3001<br \/>\n\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u306b\u6210\u529f\u3057\u305f\u3089\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u3092nil\u306b\u306a\u308b\u3088\u3046\u306b\u5909\u66f4\u3057\u3066\u307f\u307e\u3057\u3087\u3002<\/p>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u304c\u6210\u529f\u3057\u305f\u3089\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u3092nil\u306b\u3059\u308b<br \/>\n<strong>app\/controllers\/password_resets_controller.rb<\/strong><\/p>\n<pre>@user.update_attribute(:reset_digest,<strong> nil)<\/strong><\/pre>\n<p>4:\uff11\u884c\u8ffd\u52a0\u3057\u3001\uff11\u3064\u524d\u306e\u6f14\u7fd2\u8ab2\u984c\u306b\u5bfe\u3059\u308b\u30c6\u30b9\u30c8\u3092\u66f8\u3044\u3066\u307f\u307e\u3057\u3087\u3046\u3002assert_nil\u30e1\u30bd\u30c3\u30c9\u3068user.reload\u30e1\u30bd\u30c3\u30c9\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001<br \/>\nreset_digest\u5c5e\u6027\u3092\u76f4\u63a5\u30c6\u30b9\u30c8\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>password_resets_test.rb\r\n<span class=\"synPreProc\">require<\/span> <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">test_helper<\/span><span class=\"synSpecial\">'<\/span>\r\n<span class=\"synPreProc\">class<\/span> <span class=\"synType\">PasswordResetsTest<\/span> &lt; <span class=\"synType\">ActionDispatch<\/span>::<span class=\"synType\">IntegrationTest<\/span>\r\n(\u4e2d\u7565)\r\n  test <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">password resets<\/span><span class=\"synSpecial\">\"<\/span> <span class=\"synStatement\">do<\/span>\r\n(\u4e2d\u7565)\r\n  assert_redirected_to user\r\n  assert_nil user.reload[<span class=\"synSpecial\">'<\/span><span class=\"synConstant\">reset_digest<\/span><span class=\"synSpecial\">'<\/span>]\r\n<span class=\"synStatement\">end<\/span><\/strong><\/pre>\n<h2><span class=\"number\">12.4\u00a0<\/span>\u672c\u756a\u74b0\u5883\u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1 (\u518d\u63b2)<\/h2>\n<p>\u3082\u3057\u65e2\u306b\u524d\u7ae0\u3067\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3092\u7d42\u308f\u3089\u305b\u3066\u3044\u305f\u3089 \u6f14\u7fd2\u307e\u3067\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3057\u307e\u3063\u3066\u3082\u5927\u4e08\u592b\u3067\u3059\u3002<\/p>\n<h3>\u6f14\u7fd2<\/h3>\n<p>1:production\u74b0\u5883\u3067\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u6642\u306b\u5165\u529b\u3057\u305f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306b\u30e1\u30fc\u30eb\u306f\u5c4a\u304d\u307e\u3057\u305f\u304b?<span id=\"ex-6c5c45\" class=\"exercise\"><\/span><\/p>\n<p>\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3060\u3051<\/p>\n<p>2:\u30e1\u30fc\u30eb\u3092\u53d7\u4fe1\u3067\u304d\u305f\u3089\u3001\u5b9f\u969b\u306b\u30e1\u30fc\u30eb\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6709\u52b9\u5316\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u307e\u305f\u3001Heroku\u4e0a\u306e\u30ed\u30b0\u3092\u8abf\u3079\u3066\u307f\u3066\u3001\u6709\u52b9\u5316\u306b\u95a2\u3059\u308b\u30ed\u30b0\u304c\u3069\u3046\u306a\u3063\u3066\u3044\u308b\u306e\u304b\u8abf\u3079\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n<em>\u30d2\u30f3\u30c8<\/em>: \u30bf\u30fc\u30df\u30ca\u30eb\u304b\u3089<code>heroku logs<\/code>\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<span id=\"ex-59f9aa\" class=\"exercise\"><\/span><\/p>\n<p>\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3060\u3051: \u30bf\u30fc\u30df\u30ca\u30eb\u304b\u3089<code>heroku logs<\/code>\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3002<\/p>\n<p>3:\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6709\u52b9\u5316\u3067\u304d\u305f\u3089\u3001\u4eca\u5ea6\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u6b63\u3057\u304f\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u304c\u3067\u304d\u305f\u3067\u3057\u3087\u3046\u304b?<\/p>\n<p>\u52d5\u4f5c\u78ba\u8a8d\u3059\u308b\u3060\u3051<\/p>\n<h2><span class=\"number\">12.6\u00a0<\/span>\u8a3c\u660e: \u671f\u9650\u5207\u308c\u306e\u6bd4\u8f03<\/h2>\n<p><a class=\"hyperref\" href=\"https:\/\/railstutorial.jp\/chapters\/password_reset?version=5.1#sec-resetting_the_password\"><span class=\"ref\">12.3<\/span><\/a>\u3067\u306f\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u671f\u9650\u304c\u5207\u308c\u305f\u304b\u3069\u3046\u304b\u3092\u8abf\u3079\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u6bd4\u8f03\u3092\u884c\u3044\u307e\u3057\u305f\u3002<\/p>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><span class=\"n\">reset_sent_at<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">2<\/span><span class=\"o\">.<\/span><span class=\"n\">hours<\/span><span class=\"o\">.<\/span><span class=\"n\">ago<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p class=\"noindent\"><a class=\"hyperref\" href=\"https:\/\/railstutorial.jp\/chapters\/password_reset?version=5.1#code-user_model_password_reset_expired\">\u30ea\u30b9\u30c8\u00a0<span class=\"ref\">12.17<\/span><\/a>\u3067\u8aac\u660e\u3057\u305f\u3088\u3046\u306b\u3001\u3053\u306e\u5f0f\u3092\u300c\u5c11\u306a\u3044\u300d\u3068\u89e3\u91c8\u3059\u308b\u3068\u9006\u306e\u610f\u5473\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u306e\u3067\u3001\u300c\u65e9\u3044\u300d\u3068\u89e3\u91c8\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044<sup id=\"cha-12_footnote-ref-6\" class=\"footnote\"><\/sup><span class=\"fotenote-space\">\u00a0<\/span>\u3002<\/p>\n<p>\u6700\u521d\u306b\u3001\u671f\u9593\u30922\u3064\u5b9a\u7fa9\u3057\u307e\u3059\u3002<span class=\"inline_math\"><span id=\"MathJax-Element-1-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-1\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-2\" class=\"mjx-mrow\"><span id=\"MJXc-Node-3\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u0394<\/span><\/span><span id=\"MJXc-Node-4\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-5\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-6\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">\u0394tr<\/span><\/span><\/span>\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3057\u3066\u304b\u3089\u306e\u671f\u9593\u3001<span class=\"inline_math\"><span id=\"MathJax-Element-2-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-7\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-8\" class=\"mjx-mrow\"><span id=\"MJXc-Node-9\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u0394<\/span><\/span><span id=\"MJXc-Node-10\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-11\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-12\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">\u0394te<\/span><\/span><\/span>\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u306e\u6709\u52b9\u306a\u671f\u9593 (\u4f8b: 2\u6642\u9593) \u3068\u5b9a\u3081\u307e\u3059\u3002<\/p>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u306f\u3001\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u305f\u6642\u523b\u304b\u3089\u7d4c\u904e\u3057\u305f\u671f\u9593\u304c\u3001\u6709\u52b9\u671f\u9593\u3088\u308a\u3082\u9577\u304f\u306a\u3063\u305f\u5834\u5408\u306b\u300c\u671f\u9650\u5207\u308c\u300d\u3068\u306a\u308a\u307e\u3059\u3002\u3053\u308c\u3092\u6b21\u306e\u3088\u3046\u306b\u8868\u3057\u307e\u3059\u3002<\/p>\n<pre id=\"eq-time_delta\" class=\"equation\" data-tralics-id=\"uid\" data-number=\"12.1\"><strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-3-Frame\" class=\"mjx-full-width mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 4.441em; min-height: 0px; width: 10000em; position: relative; display: table-cell !important;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable displaystyle=&quot;true&quot;&gt;&lt;mlabeledtr&gt;&lt;mtd id=&quot;mjx-eqn-eqtime_delta&quot;&gt;&lt;mtext&gt;(12.1)&lt;\/mtext&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mlabeledtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-13\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-14\" class=\"mjx-mrow\"><span id=\"MJXc-Node-15\" class=\"mjx-mtable\"><span class=\"mjx-box\"><span class=\"mjx-table\"><span id=\"MJXc-Node-16\" class=\"mjx-mlabeledtr\"><span id=\"MJXc-Node-20\" class=\"mjx-mtd\"><span id=\"MJXc-Node-21\" class=\"mjx-mrow\"><span id=\"MJXc-Node-22\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u0394<\/span><\/span><span id=\"MJXc-Node-23\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-24\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-25\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-26\" class=\"mjx-mo MJXc-space3\"><span class=\"mjx-char MJXc-TeX-main-R\">&gt;\u00a0 \u00a0<\/span><\/span><span id=\"MJXc-Node-27\" class=\"mjx-mi MJXc-space3\"><span class=\"mjx-char MJXc-TeX-main-R\">\u0394<\/span><\/span><span id=\"MJXc-Node-28\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-29\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-30\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e\u3000\u3000\u3000<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mjx-itable\"><span class=\"mjx-label\"><span id=\"mjx-eqn-eqtime_delta\" class=\"mjx-mtd\"><span id=\"MJXc-Node-18\" class=\"mjx-mrow\"><span id=\"MJXc-Node-19\" class=\"mjx-mtext\"><span class=\"mjx-char MJXc-TeX-main-R\">(12.1)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong><\/pre>\n<div data-tralics-id=\"uid\" data-number=\"12.1\"><\/div>\n<p class=\"noindent\">\u3053\u3053\u3067\u3001\u73fe\u5728\u6642\u523b (\u8a33\u6ce8: \u6bd4\u8f03\u3092\u884c\u3063\u305f\u6642\u523b) \u3092<span class=\"inline_math\"><span id=\"MathJax-Element-4-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-31\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-32\" class=\"mjx-mrow\"><span id=\"MJXc-Node-33\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-34\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-35\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">N<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">tN<\/span><\/span><\/span>\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u30e1\u30fc\u30eb\u306e\u9001\u4fe1\u6642\u523b\u3092<span class=\"inline_math\"><span id=\"MathJax-Element-5-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-36\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-37\" class=\"mjx-mrow\"><span id=\"MJXc-Node-38\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-39\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-40\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">tr<\/span><\/span><\/span>\u3001\u6709\u52b9\u671f\u9593\u304c\u5207\u308c\u308b\u6642\u523b (\u4f8b: 2\u6642\u9593\u7d4c\u904e\u5f8c) \u3092<span class=\"inline_math\"><span id=\"MathJax-Element-6-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-41\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-42\" class=\"mjx-mrow\"><span id=\"MJXc-Node-43\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-44\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-45\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">te<\/span><\/span><\/span>\u3068\u8868\u3059\u3068\u3001\u6b21\u306e2\u3064\u306e\u95a2\u4fc2\u5f0f\u3092\u5f97\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre id=\"eq-delta_p\" class=\"equation\" data-tralics-id=\"uid\" data-number=\"12.2\"><strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-7-Frame\" class=\"mjx-full-width mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 5.844em; min-height: 0px; width: 10000em; position: relative; display: table-cell !important;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable displaystyle=&quot;true&quot;&gt;&lt;mlabeledtr&gt;&lt;mtd id=&quot;mjx-eqn-eqdelta_p&quot;&gt;&lt;mtext&gt;(12.2)&lt;\/mtext&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;=&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mlabeledtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-46\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-47\" class=\"mjx-mrow\"><span id=\"MJXc-Node-48\" class=\"mjx-mtable\"><span class=\"mjx-box\"><span class=\"mjx-table\"><span id=\"MJXc-Node-49\" class=\"mjx-mlabeledtr\"><span id=\"MJXc-Node-53\" class=\"mjx-mtd\"><span id=\"MJXc-Node-54\" class=\"mjx-mrow\"><span id=\"MJXc-Node-55\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u0394<\/span><\/span><span id=\"MJXc-Node-56\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-57\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-58\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-59\" class=\"mjx-mo MJXc-space3\"><span class=\"mjx-char MJXc-TeX-main-R\">= <\/span><\/span><span id=\"MJXc-Node-60\" class=\"mjx-msubsup MJXc-space3\"><span class=\"mjx-base\"><span id=\"MJXc-Node-61\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-62\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">N <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-63\" class=\"mjx-mo MJXc-space2\"><span class=\"mjx-char MJXc-TeX-main-R\">\u2212 <\/span><\/span><span id=\"MJXc-Node-64\" class=\"mjx-msubsup MJXc-space2\"><span class=\"mjx-base\"><span id=\"MJXc-Node-65\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-66\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r\u00a0 <\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mjx-itable\"><span class=\"mjx-label\"><span id=\"mjx-eqn-eqdelta_p\" class=\"mjx-mtd\"><span id=\"MJXc-Node-51\" class=\"mjx-mrow\"><span id=\"MJXc-Node-52\" class=\"mjx-mtext\"><span class=\"mjx-char MJXc-TeX-main-R\">(12.2)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong>\r\n<strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-8-Frame\" class=\"mjx-full-width mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 5.865em; min-height: 0px; width: 10000em; position: relative; display: table-cell !important;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable displaystyle=&quot;true&quot;&gt;&lt;mlabeledtr&gt;&lt;mtd id=&quot;mjx-eqn-eqdelta_e&quot;&gt;&lt;mtext&gt;(12.3)&lt;\/mtext&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;=&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mlabeledtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-67\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-68\" class=\"mjx-mrow\"><span id=\"MJXc-Node-69\" class=\"mjx-mtable\"><span class=\"mjx-box\"><span class=\"mjx-table\"><span id=\"MJXc-Node-70\" class=\"mjx-mlabeledtr\"><span id=\"MJXc-Node-74\" class=\"mjx-mtd\"><span id=\"MJXc-Node-75\" class=\"mjx-mrow\"><span id=\"MJXc-Node-76\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u00a0 \u00a0 \u00a0\u0394<\/span><\/span><span id=\"MJXc-Node-77\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-78\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-79\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-80\" class=\"mjx-mo MJXc-space3\"><span class=\"mjx-char MJXc-TeX-main-R\">= <\/span><\/span><span id=\"MJXc-Node-81\" class=\"mjx-msubsup MJXc-space3\"><span class=\"mjx-base\"><span id=\"MJXc-Node-82\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-83\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">N <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-84\" class=\"mjx-mo MJXc-space2\"><span class=\"mjx-char MJXc-TeX-main-R\">\u2212 <\/span><\/span><span id=\"MJXc-Node-85\" class=\"mjx-msubsup MJXc-space2\"><span class=\"mjx-base\"><span id=\"MJXc-Node-86\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-87\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e\u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mjx-itable\"><span class=\"mjx-label\"><span id=\"mjx-eqn-eqdelta_e\" class=\"mjx-mtd\"><span id=\"MJXc-Node-72\" class=\"mjx-mrow\"><span id=\"MJXc-Node-73\" class=\"mjx-mtext\"><span class=\"mjx-char MJXc-TeX-main-R\">(12.3)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong><\/pre>\n<p class=\"noindent\"><a class=\"hyperref\" href=\"https:\/\/railstutorial.jp\/chapters\/password_reset?version=5.1#eq-delta_p\">\u5f0f\u00a0(<span class=\"ref\">12.2<\/span>)<\/a>\u3068<a class=\"hyperref\" href=\"https:\/\/railstutorial.jp\/chapters\/password_reset?version=5.1#eq-delta_e\">\u5f0f\u00a0(<span class=\"ref\">12.3<\/span>)<\/a>\u3092<a class=\"hyperref\" href=\"https:\/\/railstutorial.jp\/chapters\/password_reset?version=5.1#eq-time_delta\">\u5f0f\u00a0(<span class=\"ref\">12.1<\/span>)<\/a>\u306b\u4ee3\u5165\u3059\u308b\u3068\u3001\u6b21\u306e\u7d50\u679c\u304c\u5f97\u3089\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"equation\"><strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-9-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable columnalign=&quot;right center left&quot; rowspacing=&quot;4pt&quot; columnspacing=&quot;1em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-88\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-89\" class=\"mjx-mrow\"><span id=\"MJXc-Node-90\" class=\"mjx-mtable\"><span class=\"mjx-table\"><span id=\"MJXc-Node-91\" class=\"mjx-mtr\"><span id=\"MJXc-Node-92\" class=\"mjx-mtd\"><span id=\"MJXc-Node-93\" class=\"mjx-mrow\"><span id=\"MJXc-Node-94\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u0394<\/span><\/span><span id=\"MJXc-Node-95\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-96\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-97\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r\u00a0 \u00a0 <\/span><\/span><\/span><\/span><\/span><\/span><span id=\"MJXc-Node-98\" class=\"mjx-mtd\"><span id=\"MJXc-Node-99\" class=\"mjx-mrow\"><span id=\"MJXc-Node-100\" class=\"mjx-mo\"><span class=\"mjx-char MJXc-TeX-main-R\">&gt;\u00a0 <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-101\" class=\"mjx-mtd\"><span id=\"MJXc-Node-102\" class=\"mjx-mrow\"><span id=\"MJXc-Node-103\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-main-R\">\u0394<\/span><\/span><span id=\"MJXc-Node-104\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-105\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-106\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong>\r\n\r\n<strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-9-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable columnalign=&quot;right center left&quot; rowspacing=&quot;4pt&quot; columnspacing=&quot;1em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-88\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-89\" class=\"mjx-mrow\"><span id=\"MJXc-Node-90\" class=\"mjx-mtable\"><span class=\"mjx-table\"><span id=\"MJXc-Node-107\" class=\"mjx-mtr\"><span id=\"MJXc-Node-108\" class=\"mjx-mtd\"><span id=\"MJXc-Node-109\" class=\"mjx-mrow\"><span id=\"MJXc-Node-110\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-111\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-112\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">N<\/span><\/span><\/span><\/span><span id=\"MJXc-Node-113\" class=\"mjx-mo MJXc-space2\"><span class=\"mjx-char MJXc-TeX-main-R\">\u2212<\/span><\/span><span id=\"MJXc-Node-114\" class=\"mjx-msubsup MJXc-space2\"><span class=\"mjx-base\"><span id=\"MJXc-Node-115\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-116\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r\u00a0 <\/span><\/span><\/span><\/span><\/span><\/span><span id=\"MJXc-Node-117\" class=\"mjx-mtd\"><span id=\"MJXc-Node-118\" class=\"mjx-mrow\"><span id=\"MJXc-Node-119\" class=\"mjx-mo\"><span class=\"mjx-char MJXc-TeX-main-R\">&gt;\u00a0 <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-120\" class=\"mjx-mtd\"><span id=\"MJXc-Node-121\" class=\"mjx-mrow\"><span id=\"MJXc-Node-122\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-123\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-124\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">N<\/span><\/span><\/span><\/span><span id=\"MJXc-Node-125\" class=\"mjx-mo MJXc-space2\"><span class=\"mjx-char MJXc-TeX-main-R\">\u2212<\/span><\/span><span id=\"MJXc-Node-126\" class=\"mjx-msubsup MJXc-space2\"><span class=\"mjx-base\"><span id=\"MJXc-Node-127\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-128\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong>\r\n\r\n<strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-9-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable columnalign=&quot;right center left&quot; rowspacing=&quot;4pt&quot; columnspacing=&quot;1em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;&amp;#x0394;&lt;\/mi&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;N&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;gt;&lt;\/mo&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-88\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-89\" class=\"mjx-mrow\"><span id=\"MJXc-Node-90\" class=\"mjx-mtable\"><span class=\"mjx-table\"><span id=\"MJXc-Node-129\" class=\"mjx-mtr\"><span id=\"MJXc-Node-130\" class=\"mjx-mtd\"><span id=\"MJXc-Node-131\" class=\"mjx-mrow\"><span id=\"MJXc-Node-132\" class=\"mjx-mo\"><span class=\"mjx-char MJXc-TeX-main-R\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2212<\/span><\/span><span id=\"MJXc-Node-133\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-134\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-135\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r\u00a0 \u00a0 <\/span><\/span><\/span><\/span><\/span><\/span><span id=\"MJXc-Node-136\" class=\"mjx-mtd\"><span id=\"MJXc-Node-137\" class=\"mjx-mrow\"><span id=\"MJXc-Node-138\" class=\"mjx-mo\"><span class=\"mjx-char MJXc-TeX-main-R\">&gt;\u00a0 <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-139\" class=\"mjx-mtd\"><span id=\"MJXc-Node-140\" class=\"mjx-mrow\"><span id=\"MJXc-Node-141\" class=\"mjx-mo\"><span class=\"mjx-char MJXc-TeX-main-R\">\u2212<\/span><\/span><span id=\"MJXc-Node-142\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-143\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-144\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong><\/pre>\n<div class=\"equation\"><\/div>\n<p class=\"noindent\">\u4e21\u8fba\u306b<span class=\"inline_math\"><span id=\"MathJax-Element-10-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;mn&gt;1&lt;\/mn&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-145\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-146\" class=\"mjx-mrow\"><span id=\"MJXc-Node-147\" class=\"mjx-mo\"><span class=\"mjx-char MJXc-TeX-main-R\">\u2212<\/span><\/span><span id=\"MJXc-Node-148\" class=\"mjx-mn\"><span class=\"mjx-char MJXc-TeX-main-R\">1<\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">\u22121<\/span><\/span><\/span>\u3092\u304b\u3051\u308b\u3068\u3001\u6b21\u306e\u5f0f\u304c\u5f97\u3089\u308c\u307e\u3059\u3002<\/p>\n<pre id=\"eq-time_comparison\" class=\"equation\" data-tralics-id=\"uid\" data-number=\"12.4\"><strong><span class=\"mjx-chtml MJXc-display\"><span id=\"MathJax-Element-11-Frame\" class=\"mjx-full-width mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; line-height: 0; text-indent: 0px; text-align: center; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 2.775em; min-height: 0px; width: 10000em; position: relative; display: table-cell !important;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable displaystyle=&quot;true&quot;&gt;&lt;mlabeledtr&gt;&lt;mtd id=&quot;mjx-eqn-eqtime_comparison&quot;&gt;&lt;mtext&gt;(12.4)&lt;\/mtext&gt;&lt;\/mtd&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;&amp;lt;&lt;\/mo&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;\/mtd&gt;&lt;\/mlabeledtr&gt;&lt;\/mtable&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-149\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-150\" class=\"mjx-mrow\"><span id=\"MJXc-Node-151\" class=\"mjx-mtable\"><span class=\"mjx-box\"><span class=\"mjx-table\"><span id=\"MJXc-Node-152\" class=\"mjx-mlabeledtr\"><span id=\"MJXc-Node-156\" class=\"mjx-mtd\"><span id=\"MJXc-Node-157\" class=\"mjx-mrow\"><span id=\"MJXc-Node-158\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-159\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-160\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">r <\/span><\/span><\/span><\/span><span id=\"MJXc-Node-161\" class=\"mjx-mo MJXc-space3\"><span class=\"mjx-char MJXc-TeX-main-R\">&lt; <\/span><\/span><span id=\"MJXc-Node-162\" class=\"mjx-msubsup MJXc-space3\"><span class=\"mjx-base\"><span id=\"MJXc-Node-163\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-164\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e\u00a0 \u00a0 <\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"mjx-itable\"><span class=\"mjx-label\"><span id=\"mjx-eqn-eqtime_comparison\" class=\"mjx-mtd\"><span id=\"MJXc-Node-154\" class=\"mjx-mrow\"><span id=\"MJXc-Node-155\" class=\"mjx-mtext\"><span class=\"mjx-char MJXc-TeX-main-R\">(12.4)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/strong><\/pre>\n<p class=\"noindent\">\u5f0f\u00a0(<span class=\"ref\">12.4<\/span>)\u3092Rails\u306e\u30b3\u30fc\u30c9\u306b\u7f6e\u304d\u63db\u3048\u3001\u5024\u3092<span class=\"inline_math\"><span id=\"MathJax-Element-12-Frame\" class=\"mjx-chtml MathJax_CHTML\" style=\"border: 0px; font-family: inherit; font-size: 19.68px; font-style: normal; font-weight: normal; margin: 0px; padding: 1px 0px; vertical-align: baseline; display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;msub&gt;&lt;mi&gt;t&lt;\/mi&gt;&lt;mi&gt;e&lt;\/mi&gt;&lt;\/msub&gt;&lt;mo&gt;=&lt;\/mo&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mn&gt;2&lt;\/mn&gt;&lt;mtext&gt;&amp;#xA0;&lt;\/mtext&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x6642;&lt;\/mo&gt;&lt;\/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x9593;&lt;\/mo&gt;&lt;\/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x524D;&lt;\/mo&gt;&lt;\/mrow&gt;&lt;\/mrow&gt;&lt;\/math&gt;\"><span id=\"MJXc-Node-165\" class=\"mjx-math\" aria-hidden=\"true\"><span id=\"MJXc-Node-166\" class=\"mjx-mrow\"><span id=\"MJXc-Node-167\" class=\"mjx-msubsup\"><span class=\"mjx-base\"><span id=\"MJXc-Node-168\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">t<\/span><\/span><\/span><span class=\"mjx-sub\"><span id=\"MJXc-Node-169\" class=\"mjx-mi\"><span class=\"mjx-char MJXc-TeX-math-I\">e<\/span><\/span><\/span><\/span><span id=\"MJXc-Node-170\" class=\"mjx-mo MJXc-space3\"><span class=\"mjx-char MJXc-TeX-main-R\">=<\/span><\/span><span id=\"MJXc-Node-171\" class=\"mjx-texatom MJXc-space3\"><span id=\"MJXc-Node-172\" class=\"mjx-mrow\"><span id=\"MJXc-Node-173\" class=\"mjx-mn\"><span class=\"mjx-char MJXc-TeX-main-R\">2<\/span><\/span><span id=\"MJXc-Node-174\" class=\"mjx-mtext\"><span class=\"mjx-char MJXc-TeX-main-R\">\u00a0<\/span><\/span><span id=\"MJXc-Node-175\" class=\"mjx-texatom\"><span id=\"MJXc-Node-176\" class=\"mjx-mrow\"><span id=\"MJXc-Node-177\" class=\"mjx-mo\"><span class=\"mjx-char\"><span class=\"mjx-charbox MJXc-TeX-unknown-R\">\u6642<\/span><\/span><\/span><\/span><\/span><span id=\"MJXc-Node-178\" class=\"mjx-texatom\"><span id=\"MJXc-Node-179\" class=\"mjx-mrow\"><span id=\"MJXc-Node-180\" class=\"mjx-mo\"><span class=\"mjx-char\"><span class=\"mjx-charbox MJXc-TeX-unknown-R\">\u9593<\/span><\/span><\/span><\/span><\/span><span id=\"MJXc-Node-181\" class=\"mjx-texatom\"><span id=\"MJXc-Node-182\" class=\"mjx-mrow\"><span id=\"MJXc-Node-183\" class=\"mjx-mo\"><span class=\"mjx-char\"><span class=\"mjx-charbox MJXc-TeX-unknown-R\">\u524d<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">te=2\u00a0\u6642\u9593\u524d<\/span><\/span><\/span>\u3068\u3059\u308b\u3068\u3001<br \/>\n<code>password_reset_expired?<\/code>\u30e1\u30bd\u30c3\u30c9\u3068\u540c\u3058\u30b3\u30fc\u30c9\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">def<\/span> <span class=\"nf\">password_reset_expired?<\/span>\r\n  <span class=\"n\">reset_sent_at<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">2<\/span><span class=\"o\">.<\/span><span class=\"n\">hours<\/span><span class=\"o\">.<\/span><span class=\"n\">ago<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/strong><\/pre>\n<\/div>\n<\/div>\n<p class=\"noindent\"><code>&lt;<\/code>\u8a18\u53f7\u3092\u300c\u301c\u3088\u308a\u5c11\u306a\u3044\u300d\u3067\u306f\u306a\u304f\u300c\u301c\u3088\u308a\u65e9\u3044\u6642\u523b\u300d\u3068\u89e3\u91c8\u3059\u308c\u3070\u3001\u300c\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u306f\u3001\u73fe\u5728\u3088\u308a2\u6642\u9593\u4ee5\u4e0a\u524d\u306e\u6642\u523b\u306b\u884c\u308f\u308c\u305f\u300d\u3068\u3044\u3046\u8a00\u660e\u3068\u4e00\u81f4\u3057\u307e\u3059\u3002<\/p>\n<h3>12\u7ae0\u306e\u307e\u3068\u3081<\/h3>\n<h4>1:\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u306f Active Record\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u306f\u306a\u3044\u304c\u3001<br \/>\n\u30bb\u30c3\u30b7\u30e7\u30f3\u3084\u30a2\u30ab\u30a6\u30f3\u30c8\u6709\u52b9\u5316\u306e\u5834\u5408\u3068\u540c\u69d8\u306b\u3001\u30ea\u30bd\u30fc\u30b9\u3067\u30e2\u30c7\u30eb\u5316\u3067\u304d\u308b<\/h4>\n<h4>2:Rails\u306f\u3001\u30e1\u30fc\u30eb\u9001\u4fe1\u3067\u6271\u3046Action Mailer\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3068\u30d3\u30e5\u30fc\u3092\u751f\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b<\/h4>\n<h4>3:Action Mailer\u3067\u306f\u30c6\u30ad\u30b9\u30c8\u30e1\u30fc\u30eb\u3068HTML\u30e1\u30fc\u30eb\u306e\u4e21\u65b9\u3092\u5229\u7528\u3067\u304d\u308b<\/h4>\n<h4>4:\u30e1\u30a4\u30e9\u30fc\u30a2\u30af\u30b7\u30e7\u30f3\u3067\u5b9a\u7fa9\u3057\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5909\u6570\u306f\u3001<br \/>\n\u4ed6\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3084\u30d3\u30e5\u30fc\u3068\u540c\u69d8\u3001\u30e1\u30a4\u30e9\u30fc\u306e\u30d3\u30e5\u30fc\u304b\u3089\u53c2\u7167\u3067\u304d\u308b<\/h4>\n<h4>5:\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u518d\u8a2d\u5b9a\u3055\u305b\u308b\u305f\u3081\u306b\u3001\u751f\u6210\u3057\u305f\u30c8\u30fc\u30af\u30f3\u3092\u4f7f\u3063\u3066\u4e00\u610f\u306eURL\u3092\u4f5c\u308b<\/h4>\n<h4>6:\u3088\u308a\u5b89\u5168\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u306e\u305f\u3081\u306b\u3001\u30cf\u30c3\u30b7\u30e5\u5316\u3057\u305f\u30c8\u30fc\u30af\u30f3 (\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8) \u3092\u4f7f\u3046<\/h4>\n<h4>7:\u30e1\u30a4\u30e9\u30fc\u306e\u30c6\u30b9\u30c8\u3068\u7d71\u5408\u30c6\u30b9\u30c8\u306f\u3001\u3069\u3061\u3089\u3082User\u30e1\u30a4\u30e9\u30fc\u306e\u632f\u821e\u3044\u3092\u78ba\u8a8d\u3059\u308b\u306e\u306b\u6709\u7528<\/h4>\n<h4>8:SendGrid\u3092\u4f7f\u3046\u3068production\u74b0\u5883\u304b\u3089\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u308b<\/h4>\n<p><a href=\"https:\/\/suzutukiblog.com\/index.php\/2021\/04\/22\/rails-tutorial-13\/\">\u305d\u306e13\u306b\u7d9a\u304f<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>12\u7ae0\u304b\u3089\u7d9a\u304f 12.3.3\u00a0\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u8a2d\u5b9a\u3092\u30c6\u30b9\u30c8\u3059\u308b \u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u3092\u30c6\u30b9\u30c8\u3059\u308b\u624b\u9806\u306f\u3001\u30a2\u30ab\u30a6\u30f3\u30c8\u6709\u52b9\u5316\u306e\u30c6\u30b9\u30c8\u3068\u591a\u304f\u306e\u5171\u901a\u70b9\u304c\u3042\u308a\u307e\u3059\u304c\u3001 \u30c6\u30b9\u30c8\u306e\u5192\u982d\u90e8\u5206\u306b\u306f\u6b21\u306e\u3088\u3046\u306a\u9055\u3044\u304c\u3042\u308a\u307e\u3059\u3002 \u6700\u521d\u306b\u300cforgot [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"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-3060","post","type-post","status-publish","format-standard","hentry","category-programming-note","category-rails"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3060","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=3060"}],"version-history":[{"count":9,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3060\/revisions"}],"predecessor-version":[{"id":4585,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3060\/revisions\/4585"}],"wp:attachment":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/media?parent=3060"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/categories?post=3060"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/tags?post=3060"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}