1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <!-- Google Tag Manager --> 5
5<script>
vendor: 367 bytes, lines 5-9
5(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 6 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 7 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 8 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 9 })(window,document,'script','dataLayer','
9GTM-KSKVTCG
vendor: 3 bytes, line 9
9');
9</script>
9 10 <!-- End Google Tag Manager --> 11 <title> 12 Rails ãã¯ãããã - Railsã¬ã¤ã 13</title> 14 15<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 16<meta name="viewport" content="width=device-width, initial-scale=1"> 17<meta name="description" content="Railsã®ã¤ã³ã¹ãã¼ã«æ¹æ³ã¨æåã®Railsã¢ããªã±ã¼ã·ã§ã³ã®ä½æã«å¿ è¦ãªãã¹ã¦ã解説ãã¾ãã"> 18<meta name="keywords" content="Ruby Rails ã¬ã¤ã ä½ç³»ç å ¥é ç¡æ"> 19<meta name="author" content="YassLab æ ªå¼ä¼ç¤¾"> 20<link rel="author" type="text/plain" href="https://railsguides.jp/humans.txt"> 21 22 23<meta property="fb:admins" content="715330868"> 24<meta property="fb:app_id" content="614116885378153"> 25<meta property="og:type" content="article"> 26<meta property="og:site_name" content="Rails ãã¯ãããã - Railsã¬ã¤ã"> 27<meta property="og:title" content="Rails ãã¯ãããã - Railsã¬ã¤ã"> 28<meta property="og:description" content="Railsã®ã¤ã³ã¹ãã¼ã«æ¹æ³ã¨æåã®Railsã¢ããªã±ã¼ã·ã§ã³ã®ä½æã«å¿ è¦ãªãã¹ã¦ã解説ãã¾ãã"> 29<meta property="og:image" content="https://railsguides.jp/images/cover_for_facebook.png"> 30<meta property="og:url" content="https://railsguides.jp/getting_started.html"> 31 32<meta name="twitter:card" content="summary"> 33<meta name="twitter:site" content="@RailsGuidesJP"> 34<meta name="twitter:title" content="Rails ãã¯ãããã - Railsã¬ã¤ã"> 35<meta name="twitter:description" content="Railsã®ã¤ã³ã¹ãã¼ã«æ¹æ³ã¨æåã®Railsã¢ããªã±ã¼ã·ã§ã³ã®ä½æã«å¿ è¦ãªãã¹ã¦ã解説ãã¾ãã"> 36<meta name="twitter:url" content="https://railsguides.jp/getting_started.html"> 37<meta name="twitter:image" content="https://railsguides.jp/images/cover_for_twitter.png"> 38 39<meta name="apple-mobile-web-app-title" content="Railsã¬ã¤ã"> 40<meta name="application-name" content="Railsã¬ã¤ã"> 41 42<link href="/railsguides/images/favicon.ico" rel="shortcut icon" type="image/x-icon"> 43 44<link rel="apple-touch-icon" sizes="57x57" href="/railsguides/images/favicons/apple-icon-57x57.png"> 45<link rel="apple-touch-icon" sizes="60x60" href="/railsguides/images/favicons/apple-icon-60x60.png"> 46<link rel="apple-touch-icon" sizes="72x72" href="/railsguides/images/favicons/apple-icon-72x72.png"> 47<link rel="apple-touch-icon" sizes="76x76" href="/railsguides/images/favicons/apple-icon-76x76.png"> 48<link rel="apple-touch-icon" sizes="114x114" href="/railsguides/images/favicons/apple-icon-114x114.png"> 49<link rel="apple-touch-icon" sizes="120x120" href="/railsguides/images/favicons/apple-icon-120x120.png"> 50<link rel="apple-touch-icon" sizes="144x144" href="/railsguides/images/favicons/apple-icon-144x144.png"> 51<link rel="apple-touch-icon" sizes="152x152" href="/railsguides/images/favicons/apple-icon-152x152.png"> 52<link rel="apple-touch-icon" sizes="180x180" href="/railsguides/images/favicons/apple-icon-180x180.png"> 53<link rel="icon" type="image/png" sizes="16x16" href="/railsguides/images/favicons/favicon-16x16.png"> 54<link rel="icon" type="image/png" sizes="32x32" href="/railsguides/images/favicons/favicon-32x32.png"> 55<link rel="icon" type="image/png" sizes="96x96" href="/railsguides/images/favicons/favicon-96x96.png"> 56<link rel="icon" type="image/png" sizes="192x192" href="/railsguides/images/favicons/android-icon-192x192.png"> 57 58<link rel="manifest" href="/manifest.json"> 59<link rel="mask-icon" href="/railsguides/images/favicons/safari-pinned-tab.svg" color="#c94132"> 60<meta name="msapplication-TileColor" content="#ffffff"> 61<meta name="msapplication-TileImage" content="/railsguides/images/favicons/ms-icon-144x144.png"> 62<meta name="theme-color" content="#ffffff"> 63 64 65 <meta name="csrf-param" content="authenticity_token" /> 66<meta name="csrf-token" content="cenngHxABlnLEXfJl36HUh1ht5c5krjHZlDySJyTlzqWRVaTESUk-WI3Yhs0caVfZapV8ER50IeaHbe0KeIhNw" /> 67 68 69 <link rel="stylesheet" href="/railsguides/stylesheets/style.css" media="screen" /> <!-- main.css èªãã§ããé¨å --> 70 <link rel="stylesheet" href="/railsguides/stylesheets/print.css" media="print" /> 71 <link rel="stylesheet" href="/railsguides/stylesheets/rouge_highlight_github.css" media="screen" /> 72 <link rel="stylesheet" href="/assets/application-8f12ae681c23165e8446f8779f3509c694016d7ae2a7a36b78a4164d24586436.css" /> 73
73<script src="/assets/application-4180822f2ab92d33017da20e0e2534adddf3ed219caea290056a6a1f25195c1d.js"></script>
73 74
74<script src="/assets/version-b316c4f4762375f6eb16dadabcb4a189d55a99a421379bcd10102997d3b106d3.js"></script>
74 75
75<script src="/assets/switch_disable_darkmode-0ce494430f9e27bb289c0fcaceba79fcc8c2362585160ae034fa5c5f3bf09c4b.js"></script>
75 76 77 <!--twemoji--> 78
78<script src="/assets/twemoji-9ba82527eaa71e81e053641db99fee3d45605b0666c9495ce80fa260ab5b66d6.js"></script>
78 79 80
80<script src="https://kit.fontawesome.com/82f32b9df5.js" crossorigin="anonymous"></script>
80 81 </head> 82 83 <body> 84 <!-- Google Tag Manager (noscript) -->
vendor: 74 bytes, lines 84-85
84 85 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
85GTM-KSKVTCG
vendor: 97 bytes, lines 85-87
85" 86 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 87
87<!-- End Google Tag Manager (noscript) --> 88 89 <div id="fb-root"></div>
90<script> 91 (function(d, s, id) { 92 var js, fjs = d.getElementsByTagName(s)[0]; 93 if (d.getElementById(id)) return; 94 js = d.createElement(s); js.id = id; 95 js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=614116885378153&version=v2.0"; 96 fjs.parentNode.insertBefore(js, fjs); 97 }(document, 'script', 'facebook-jssdk')); 98</script>
98 99 100 101 102<!-- 103<div class="header_news"> 104 <div class="header_news__container"> 105 <a href="https://note.com/yasslab/n/n85fc874140d7?magazine_key=ma5df1164c798" target="_blank" rel="noopener"> 106 ãã¡ã³ããã³ã¹ã®ãç¥ããã2025å¹´10æ26æ¥(æ¥)4:30~5:00ã®éã¡ã³ããã³ã¹ã®ãããµã¤ãã«ã¢ã¯ã»ã¹ã§ããªããªãã¾ãã 107 </a> 108 </div> 109</div> 110--> 111 112<div id="header" class="fixed"> 113 <div class="wrapper clearfix"> 114 <h1><a href="/" title="ãã¼ã ã«æ»ã">Rails ã¬ã¤ã</a></h1> 115 <div class='version-select'> 116 <select name="verselect" id="verselect"><option selected="selected" value="8.1">v8.1</option> 117<option value="8.0">v8.0</option> 118<option value="7.2">v7.2</option> 119<option value="7.1">v7.1</option> 120<option value="7.0">v7.0</option> 121<option value="6.1">v6.1</option> 122<option value="6.0">v6.0</option> 123<option value="5.2">v5.2</option> 124<option value="5.1">v5.1</option> 125<option value="5.0">v5.0</option> 126<option value="4.2">v4.2</option></select> 127 </div> 128 <div id="nav"> 129 <ul class="header-toc-pc "> 130 <li class="guides-index guides-index-large"> 131 <a href="/" id="guidesMenu" class="guides-index-item nav-item">ã¬ã¤ãç®æ¬¡</a> 132 <div id="guides" class="clearfix" style="display: none;"> 133 <hr> 134 <div class="guides-scroll"> 135 <dl class="L"> 136 <dt>ã¯ããã«</dt> 137 <dd><a href="/getting_started.html">Rails ãã¯ãããã</a></dd> 138 <dd><a href="/install_ruby_on_rails.html">Ruby on Rails ã¤ã³ã¹ãã¼ã«ã¬ã¤ã</a></dd> 139 <dd><a href="/getting_started_with_devcontainer.html">Dev Container ã§ã®éçºã¬ã¤ã</a></dd> 140 <dd><a href="/sign_up_and_settings.html">æ¼ç¿ï¼ã¦ã¼ã¶ã¼ç»é²ã»è¨å®æ©è½ã®è¿½å </a></dd> 141 <dd><a href="/wishlists.html">æ¼ç¿ï¼ã¦ã£ãã·ã¥ãªã¹ãæ©è½ã®è¿½å </a></dd> 142 <dt>ã¢ãã«</dt> 143 <dd><a href="/active_record_basics.html">Active Record ã®åºç¤</a></dd> 144 <dd><a href="/active_record_migrations.html">Active Record ãã¤ã°ã¬ã¼ã·ã§ã³</a></dd> 145 <dd><a href="/active_record_validations.html">Active Record ããªãã¼ã·ã§ã³</a></dd> 146 <dd><a href="/active_record_callbacks.html">Active Record ã³ã¼ã«ããã¯</a></dd> 147 <dd><a href="/association_basics.html">Active Record ã®é¢é£ä»ã</a></dd> 148 <dd><a href="/active_record_querying.html">Active Record ã¯ã¨ãªã¤ã³ã¿ã¼ãã§ã¤ã¹</a></dd> 149 <dd><a href="/active_model_basics.html">Active Model ã®åºç¤</a></dd> 150 <dt>ãã¥ã¼</dt> 151 <dd><a href="/action_view_overview.html">Action View ã®æ¦è¦</a></dd> 152 <dd><a href="/layouts_and_rendering.html">ã¬ã¤ã¢ã¦ãã¨ã¬ã³ããªã³ã°</a></dd> 153 <dd><a href="/action_view_helpers.html">Action View ãã«ãã¼</a></dd> 154 <dd><a href="/form_helpers.html">Action View ãã©ã¼ã ãã«ãã¼</a></dd> 155 <dt>ã³ã³ããã¼ã©</dt> 156 <dd><a href="/action_controller_overview.html">Action Controller ã®æ¦è¦</a></dd> 157 <dd><a href="/action_controller_advanced_topics.html">Action Controller ã®é«åº¦ãªãããã¯</a></dd> 158 <dd><a href="/routing.html">Rails ã®ã«ã¼ãã£ã³ã°</a></dd> 159 <dt>ä»ã®æ§æè¦ç´ </dt> 160 <dd><a href="/active_support_core_extensions.html">Active Support ã³ã¢æ¡å¼µæ©è½</a></dd> 161 <dd><a href="/action_mailer_basics.html">Action Mailer ã®åºç¤</a></dd> 162 <dd><a href="/action_mailbox_basics.html">Action Mailbox ã®åºç¤</a></dd> 163 <dd><a href="/action_text_overview.html">Action Text ã®æ¦è¦</a></dd> 164 <dd><a href="/active_job_basics.html">Active Job ã®åºç¤</a></dd> 165 <dd><a href="/active_storage_overview.html">Active Storage ã®æ¦è¦</a></dd> 166 <dd><a href="/action_cable_overview.html">Action Cable ã®æ¦è¦</a></dd> 167 <dd><a href="/webpacker.html">Webpacker ã®æ¦è¦</a></dd> 168 </dl> 169 <dl class="R"> 170 <dt>é«åº¦ãªãããã¯</dt> 171 <dd><a href="/i18n.html">Rails å½éåï¼I18nï¼API</a></dd> 172 <dd><a href="/testing.html">Rails ãã¹ãã£ã³ã°ã¬ã¤ã</a></dd> 173 <dd><a href="/debugging_rails_applications.html">Rails ã¢ããªã±ã¼ã·ã§ã³ã®ãããã°</a></dd> 174 <dd><a href="/configuring.html">Rails ã¢ããªã±ã¼ã·ã§ã³ã®è¨å®é ç®</a></dd> 175 <dd><a href="/command_line.html">ã³ãã³ãã©ã¤ã³ãã¼ã«</a></dd> 176 <dd><a href="/asset_pipeline.html">ã¢ã»ãããã¤ãã©ã¤ã³</a></dd> 177 <dd><a href="/working_with_javascript_in_rails.html">Rails ã§ JavaScript ãå©ç¨ãã</a></dd> 178 <dd><a href="/initialization.html">Rails ã®åæåããã»ã¹</a></dd> 179 <dd><a href="/autoloading_and_reloading_constants.html">Rails ã®èªåèªã¿è¾¼ã¿ã¨åèªã¿è¾¼ã¿</a></dd> 180 <dd><a href="/classic_to_zeitwerk_howto.html">Classic ãã Zeitwerk ã¸ã®ç§»è¡</a></dd> 181 <dd><a href="/active_support_instrumentation.html">Active Support Instrumentation ã§è¨æ¸¬</a></dd> 182 <dd><a href="/api_app.html">Rails ã«ãã API å°ç¨ã¢ããªã±ã¼ã·ã§ã³</a></dd> 183 <dd><a href="/tuning_performance_for_deployment.html">ãããã¤ç¨ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°</a></dd> 184 <dd><a href="/caching_with_rails.html">Rails ã®ãã£ãã·ã¥æ©æ§</a></dd> 185 <dd><a href="/security.html">Rails ã»ãã¥ãªãã£ã¬ã¤ã</a></dd> 186 <dd><a href="/error_reporting.html">Rails ã¢ããªã±ã¼ã·ã§ã³ã®ã¨ã©ã¼éç¥</a></dd> 187 <dt>Active Recordã®é«åº¦ãªè©±é¡</dt> 188 <dd><a href="/active_record_postgresql.html">Active Record 㨠PostgreSQL</a></dd> 189 <dd><a href="/active_record_encryption.html">Active Record ã¨æå·å</a></dd> 190 <dd><a href="/active_record_multiple_databases.html">Active Record ã®è¤æ°ãã¼ã¿ãã¼ã¹å¯¾å¿</a></dd> 191 <dd><a href="/active_record_composite_primary_keys.html">Active Record ã®è¤å主ãã¼</a></dd> 192 <dt>Rails ãæ¡å¼µãã</dt> 193 <dd><a href="/plugins.html">Rails ãã©ã°ã¤ã³ä½æå ¥é</a></dd> 194 <dd><a href="/rails_on_rack.html">Rails 㨠Rack</a></dd> 195 <dd><a href="/generators.html">Rails ã¸ã§ãã¬ã¼ã¿ã¨ãã³ãã¬ã¼ãå ¥é</a></dd> 196 <dd><a href="/engines.html">Rails ã¨ã³ã¸ã³å ¥é</a></dd> 197 <dd><a href="/threading_and_code_execution.html">Rails ã®ã¹ã¬ããã¨ã³ã¼ãå®è¡</a></dd> 198 <dt>Ruby on Rails ã«è²¢ç®ãã</dt> 199 <dd><a href="/contributing_to_ruby_on_rails.html">Ruby on Rails ã«è²¢ç®ããæ¹æ³</a></dd> 200 <dd><a href="/development_dependencies_install.html">Rails ã³ã¢éçºç°å¢ã®æ§ç¯æ¹æ³</a></dd> 201 <dd><a href="/api_documentation_guidelines.html">API ããã¥ã¡ã³ã使ã¬ã¤ãã©ã¤ã³</a></dd> 202 <dd><a href="/ruby_on_rails_guides_guidelines.html">Rails ã¬ã¤ãã®ã¬ã¤ãã©ã¤ã³</a></dd> 203 <dt>ã¡ã³ããã³ã¹ããªã·ã¼</dt> 204 <dd><a href="/maintenance_policy.html">Ruby on Rails ã®ã¡ã³ããã³ã¹ããªã·ã¼</a></dd> 205 <dt>ãªãªã¼ã¹ãã¼ã</dt> 206 <dd><a href="/upgrading_ruby_on_rails.html">Rails ã¢ããã°ã¬ã¼ãã¬ã¤ã</a></dd> 207 <dd><a href="/8_1_release_notes.html">Rails 8.1 - 2025/10</a></dd> 208 <dd><a href="/8_0_release_notes.html">Rails 8.0 - 2024/11</a></dd> 209 <dd><a href="/7_2_release_notes.html">Rails 7.2 - 2024/08</a></dd> 210 <dd><a href="/7_1_release_notes.html">Rails 7.1 - 2023/10</a></dd> 211 <dd><a href="/7_0_release_notes.html">Rails 7.0 - 2021/12</a></dd> 212 <dd><a href="/6_1_release_notes.html">
212Rails 6.1 - 2020/12</a></dd> 213 <dd><a href="/6_0_release_notes.html">Rails 6.0 - 2019/08</a></dd> 214 <dd><a href="/5_2_release_notes.html">Rails 5.2 - 2018/04</a></dd> 215 <dd><a href="/5_1_release_notes.html">Rails 5.1 - 2017/04</a></dd> 216 <dd><a href="/5_0_release_notes.html">Rails 5.0 - 2016/06</a></dd> 217 <dd><a href="/4_2_release_notes.html">Rails 4.2 - 2014/12</a></dd> 218 <dd><a href="/4_1_release_notes.html">Rails 4.1 - 2014/04</a></dd> 219 <dd><a href="/4_0_release_notes.html">Rails 4.0 - 2013/06</a></dd> 220 <dd><a href="/3_2_release_notes.html">Rails 3.2 - 2012/01</a></dd> 221 <dd><a href="/3_1_release_notes.html">Rails 3.1 - 2011/08</a></dd> 222 <dd><a href="/3_0_release_notes.html">Rails 3.0 - 2010/08</a></dd> 223 <dd><a href="/2_3_release_notes.html">Rails 2.3 - 2009/03</a></dd> 224 <dd><a href="/2_2_release_notes.html">Rails 2.2 - 2008/11</a></dd> 225 </dl> 226 </div> 227 </div> 228 </li> 229 </ul> 230 <ul id="nav-sp"> 231 <li class="nav-item-pc"><a class="nav-item" href="/contributing_to_ruby_on_rails.html">è²¢ç®ãã</a></li> 232 <li><a class="nav-item" href="/ebook">é»åæ¸ç±</a></li> 233 <li><a class="nav-item" href="/pro">Proãã©ã³</a></li> 234 <li class="guides-index guides-index-small"> 235 <select class="guides-index-item nav-item"> 236 <option value="/">ã¬ã¤ãç®æ¬¡</option> 237 <optgroup label="ã¯ããã«"> 238 <option value="/getting_started.html">Rails ãã¯ãããã</option> 239 <option value="/install_ruby_on_rails.html">Ruby on Rails ã¤ã³ã¹ãã¼ã«ã¬ã¤ã</option> 240 <option value="/getting_started_with_devcontainer.html">Dev Container ã§ã®éçºã¬ã¤ã</option> 241 <option value="/sign_up_and_settings.html">æ¼ç¿ï¼ã¦ã¼ã¶ã¼ç»é²ã»è¨å®æ©è½ã®è¿½å </option> 242 <option value="/wishlists.html">æ¼ç¿ï¼ã¦ã£ãã·ã¥ãªã¹ãæ©è½ã®è¿½å </option> 243 </optgroup> 244 <optgroup label="ã¢ãã«"> 245 <option value="/active_record_basics.html">Active Record ã®åºç¤</option> 246 <option value="/active_record_migrations.html">Active Record ãã¤ã°ã¬ã¼ã·ã§ã³</option> 247 <option value="/active_record_validations.html">Active Record ããªãã¼ã·ã§ã³</option> 248 <option value="/active_record_callbacks.html">Active Record ã³ã¼ã«ããã¯</option> 249 <option value="/association_basics.html">Active Record ã®é¢é£ä»ã</option> 250 <option value="/active_record_querying.html">Active Record ã¯ã¨ãªã¤ã³ã¿ã¼ãã§ã¤ã¹</option> 251 <option value="/active_model_basics.html">Active Model ã®åºç¤</option> 252 </optgroup> 253 <optgroup label="ãã¥ã¼"> 254 <option value="/action_view_overview.html">Action View ã®æ¦è¦</option> 255 <option value="/layouts_and_rendering.html">ã¬ã¤ã¢ã¦ãã¨ã¬ã³ããªã³ã°</option> 256 <option value="/action_view_helpers.html">Action View ãã«ãã¼</option> 257 <option value="/form_helpers.html">Action View ãã©ã¼ã ãã«ãã¼</option> 258 </optgroup> 259 <optgroup label="ã³ã³ããã¼ã©"> 260 <option value="/action_controller_overview.html">Action Controller ã®æ¦è¦</option> 261 <option value="/action_controller_advanced_topics.html">Action Controller ã®é«åº¦ãªãããã¯</option> 262 <option value="/routing.html">Rails ã®ã«ã¼ãã£ã³ã°</option> 263 </optgroup> 264 <optgroup label="ä»ã®æ§æè¦ç´ "> 265 <option value="/active_support_core_extensions.html">Active Support ã³ã¢æ¡å¼µæ©è½</option> 266 <option value="/action_mailer_basics.html">Action Mailer ã®åºç¤</option> 267 <option value="/action_mailbox_basics.html">Action Mailbox ã®åºç¤</option> 268 <option value="/action_text_overview.html">Action Text ã®æ¦è¦</option> 269 <option value="/active_job_basics.html">Active Job ã®åºç¤</option> 270 <option value="/active_storage_overview.html">Active Storage ã®æ¦è¦</option> 271 <option value="/action_cable_overview.html">Action Cable ã®æ¦è¦</option> 272 <option value="/webpacker.html">Webpacker ã®æ¦è¦</option> 273 </optgroup> 274 <optgroup label="é«åº¦ãªãããã¯"> 275 <option value="/i18n.html">Rails å½éåï¼I18nï¼API</option> 276 <option value="/testing.html">Rails ãã¹ãã£ã³ã°ã¬ã¤ã</option> 277 <option value="/debugging_rails_applications.html">Rails ã¢ããªã±ã¼ã·ã§ã³ã®ãããã°</option> 278 <option value="/configuring.html">Rails ã¢ããªã±ã¼ã·ã§ã³ã®è¨å®é ç®</option> 279 <option value="/command_line.html">ã³ãã³ãã©ã¤ã³ãã¼ã«</option> 280 <option value="/asset_pipeline.html">ã¢ã»ãããã¤ãã©ã¤ã³</option> 281 <option value="/working_with_javascript_in_rails.html">Rails ã§ JavaScript ãå©ç¨ãã</option> 282 <option value="/initialization.html">Rails ã®åæåããã»ã¹</option> 283 <option value="/autoloading_and_reloading_constants.html">Rails ã®èªåèªã¿è¾¼ã¿ã¨åèªã¿è¾¼ã¿</option> 284 <option value="/classic_to_zeitwerk_howto.html">Classic ãã Zeitwerk ã¸ã®ç§»è¡</option> 285 <option value="/active_support_instrumentation.html">Active Support Instrumentation ã§è¨æ¸¬</option> 286 <option value="/api_app.html">Rails ã«ãã API å°ç¨ã¢ããªã±ã¼ã·ã§ã³</option> 287 <option value="/tuning_performance_for_deployment.html">ãããã¤ç¨ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°</option> 288 <option value="/caching_with_rails.html">Rails ã®ãã£ãã·ã¥æ©æ§</option> 289 <option value="/security.html">Rails ã»ãã¥ãªãã£ã¬ã¤ã</option> 290 <option value="/error_reporting.html">
290Rails ã¢ããªã±ã¼ã·ã§ã³ã®ã¨ã©ã¼éç¥</option> 291 </optgroup> 292 <optgroup label="Active Recordã®é«åº¦ãªè©±é¡"> 293 <option value="/active_record_postgresql.html">Active Record 㨠PostgreSQL</option> 294 <option value="/active_record_encryption.html">Active Record ã¨æå·å</option> 295 <option value="/active_record_multiple_databases.html">Active Record ã®è¤æ°ãã¼ã¿ãã¼ã¹å¯¾å¿</option> 296 <option value="/active_record_composite_primary_keys.html">Active Record ã®è¤å主ãã¼</option> 297 </optgroup> 298 <optgroup label="Rails ãæ¡å¼µãã"> 299 <option value="/plugins.html">Rails ãã©ã°ã¤ã³ä½æå ¥é</option> 300 <option value="/rails_on_rack.html">Rails 㨠Rack</option> 301 <option value="/generators.html">Rails ã¸ã§ãã¬ã¼ã¿ã¨ãã³ãã¬ã¼ãå ¥é</option> 302 <option value="/engines.html">Rails ã¨ã³ã¸ã³å ¥é</option> 303 <option value="/threading_and_code_execution.html">Rails ã®ã¹ã¬ããã¨ã³ã¼ãå®è¡</option> 304 </optgroup> 305 <optgroup label="Ruby on Rails ã«è²¢ç®ãã"> 306 <option value="/contributing_to_ruby_on_rails.html">Ruby on Rails ã«è²¢ç®ããæ¹æ³</option> 307 <option value="/development_dependencies_install.html">Rails ã³ã¢éçºç°å¢ã®æ§ç¯æ¹æ³</option> 308 <option value="/api_documentation_guidelines.html">API ããã¥ã¡ã³ã使ã¬ã¤ãã©ã¤ã³</option> 309 <option value="/ruby_on_rails_guides_guidelines.html">Rails ã¬ã¤ãã®ã¬ã¤ãã©ã¤ã³</option> 310 </optgroup> 311 <optgroup label="ã¡ã³ããã³ã¹ããªã·ã¼"> 312 <option value="/maintenance_policy.html">Ruby on Rails ã®ã¡ã³ããã³ã¹ããªã·ã¼</option> 313 </optgroup> 314 <optgroup label="ãªãªã¼ã¹ãã¼ã"> 315 <option value="/upgrading_ruby_on_rails.html">Rails ã¢ããã°ã¬ã¼ãã¬ã¤ã</option> 316 <option value="/8_1_release_notes.html">Rails 8.1 - 2025/10</option> 317 <option value="/8_0_release_notes.html">Rails 8.0 - 2024/11</option> 318 <option value="/7_2_release_notes.html">Rails 7.2 - 2024/08</option> 319 <option value="/7_1_release_notes.html">Rails 7.1 - 2023/10</option> 320 <option value="/7_0_release_notes.html">Rails 7.0 - 2021/12</option> 321 <option value="/6_1_release_notes.html">Rails 6.1 - 2020/12</option> 322 <option value="/6_0_release_notes.html">Rails 6.0 - 2019/08</option> 323 <option value="/5_2_release_notes.html">Rails 5.2 - 2018/04</option> 324 <option value="/5_1_release_notes.html">Rails 5.1 - 2017/04</option> 325 <option value="/5_0_release_notes.html">Rails 5.0 - 2016/06</option> 326 <option value="/4_2_release_notes.html">Rails 4.2 - 2014/12</option> 327 <option value="/4_1_release_notes.html">Rails 4.1 - 2014/04</option> 328 <option value="/4_0_release_notes.html">Rails 4.0 - 2013/06</option> 329 <option value="/3_2_release_notes.html">Rails 3.2 - 2012/01</option> 330 <option value="/3_1_release_notes.html">Rails 3.1 - 2011/08</option> 331 <option value="/3_0_release_notes.html">Rails 3.0 - 2010/08</option> 332 <option value="/2_3_release_notes.html">Rails 2.3 - 2009/03</option> 333 <option value="/2_2_release_notes.html">Rails 2.2 - 2008/11</option> 334 </optgroup> 335 </select> 336 </li> 337 <ul class="nav-login-menu-list"> 338 <li class="nav-login-menu-item"><a href="/users/login">ãã°ã¤ã³</a></li> 339 </ul> 340 341 </ul> 342 <ul class="nav"> 343 <li class="nav-item-pc"><a class="nav-item" href="/contributing_to_ruby_on_rails.html">è²¢ç®ãã</a></li> 344 <li><a class="nav-item" href="/ebook">é»åæ¸ç±</a><a href="/ebook" class="nav-item-sp"><img alt="é»åæ¸ç±" data-src="/assets/icon-book-5478e65ecf704b7d3a7103ab3263fd9577c578af09245a9f05397015ac52846b.png" loading="lazy" class="lazyload" src="/spinner.svg" /></a></li> 345 <li><a class="nav-item" href="/pro">Proãã©ã³</a><a href="/pro" class="nav-item-sp"><img alt="ãããã©ã³" data-src="/assets/icon-pro-51e8c7c42c2eeafe597df752a11539de35f82a6fc8a9d08b4178ac2bbc2c4767.png" loading="lazy" class="lazyload" src="/spinner.svg" /></a></li> 346 </ul> 347 <div class="header-icons"> 348 <div class="notice-section header-icons__item"> 349 <label class="notice-button" id="" for="notice-check">
350 <span class="notice-button__icon"><i class="far fa-bell"></i></span> 351 </label> 352 <input type="checkbox" id="notice-check"/> 353 <div class="notice-list-section"> 354 <ul class="notice-list"> 355 <li class="notice-list__header"> 356 ãç¥ãã 357 </li> 358 <li class="notice-list__item"> 359 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/naa68e1ad293a?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>RailsTokyo#5 ãæ¯æ´</span><span class='notice-list__item__date'>2026-07-10</span></a> 360 </li> 361 <li class="notice-list__item"> 362 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/n12805ed831a0?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>OSS Gate 10å¨å¹´ã«ã³ãã¡ã¬ã³ã¹æ¯æ´</span><span class='notice-list__item__date'>2026-06-25</span></a> 363 </li> 364 <li class="notice-list__item"> 365 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/n604e1b092f5c?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>ã³ãã¥ããã£æ¯æ´: OSS Gate</span><span class='notice-list__item__date'>2026-01-23</span></a> 366 </li> 367 <li class="notice-list__item"> 368 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/nbbbbc52206ad?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>Railsã¬ã¤ãã Rails 8.1 ã«å¯¾å¿</span><span class='notice-list__item__date'>2025-10-24</span></a> 369 </li> 370 <li class="notice-list__item"> 371 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/n85fc874140d7?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>ï¸ Railsã¬ã¤ãæ¹åã«ä¼´ãã¡ã³ããã³ã¹ã®ãç¥ãã</span><span class='notice-list__item__date'>2025-10-22</span></a> 372 </li> 373 <li class="notice-list__item"> 374 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/n01f1e07eb35c?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>Proãã©ã³ã«AIãµãã¼ããç»å ´</span><span class='notice-list__item__date'>2025-08-27</span></a> 375 </li> 376 <li class="notice-list__item"> 377 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/n6856770ba7ff?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>ï¸ Railsæè¡è èªå®è©¦é¨ã®åèææã¨ãã¦æ¡ç¨!</span><span class='notice-list__item__date'>2025-06-27</span></a> 378 </li> 379 <li class="notice-list__item"> 380 <a target="_blank" rel="noopener" class="notice-list__link" href="https://note.com/yasslab/n/n907fd73757af?magazine_key=ma5df1164c798"><span class='notice-list__item__title'>åè³ãã©ã³ã§Proãã©ã³ãå©ç¨å¯è½ã«ï¼</span><span class='notice-list__item__date'>2025-06-06</span></a> 381 </li> 382 </ul> 383 </div> 384 </div> 385 </div> 386 <div class="nav-login-cover"> 387 <!-- ãªã½ã¼ã¹ã§ãã°ã¤ã³ãã¦ãªãç¶æ ã--> 388 <a class="nav-login-pc" id="guides-Logout" href="/users/login">ãã°ã¤ã³</a> 389 </div> 390 391 <div id="mainNav__toggle" class="mainNav__toggle"> 392 <a href="#" class="mainNav__toggle__button"><span class="hamburger-button__bars"><img alt="ãã³ãã¼ã¬ã¼ã¡ãã¥ã¼" data-src="/assets/menu-891ed698fffbdef7d848319cad3962d008628a04650f5a53969c5db33d8b7659.png" loading="lazy" class="lazyload" src="/spinner.svg" /></span></a> 393 </div> 394 </div> 395 <div id="page_top"><a href="#"></a></div> 396 </div> 397</div> 398 399 <section> 400 <a href="#shortcut_help" class="shortcut_help" style='display: none;'></a> 401 <div id="shortcut_help" style="display:none;"> 402 <h2>Keybord Shortcuts</h2> 403 <table class='shortcut-keys'> 404 <tr> 405 <td> 406 <span class='shortcut-key'>/</span>
407 <span class='key-description'>æ¤ç´¢ãéå§</span> 408 </td> 409 <td> 410 <span class='shortcut-key'>ctrl + p </span> 411 <span class='key-description'>åã®æ¤ç´¢é ç®</span> 412 </td> 413 <td> 414 <span class='shortcut-key'>â</span> 415 <span class='key-description'>åã®æ¤ç´¢é ç®</span> 416 </td> 417 </tr> 418 <tr> 419 <td> 420 <span class='shortcut-key'>esc</span> 421 <span class='key-description'>ãã©ã¼ã«ã¹ãè§£é¤</span> 422 </td> 423 <td> 424 <span class='shortcut-key'>ctrl + n</span> 425 <span class='key-description'>æ¬¡ã®æ¤ç´¢é ç®</span> 426 </td> 427 <td> 428 <span class='shortcut-key'>â</span> 429 <span class='key-description'>æ¬¡ã®æ¤ç´¢é ç®</span> 430 </td> 431 </tr> 432 <tr> 433 <td> 434 <span class='shortcut-key'>cmd + f</span> 435 <span class='key-description'>ãã¼ã¸å æ¤ç´¢ (ãã©ã¦ã¶æ¨æº)</span> 436 </td> 437 <td> 438 <span class='shortcut-key'>?</span> 439 <span class='key-description'>ãã«ãã®è¡¨ç¤º</span> 440 </td> 441 <td> 442 </td> 443 </tr> 444 </table> 445 </div> 446</section> 447 448 <section> 449 <a href="#ai_request" class="modal-ai_request" style='display: none;'></a> 450 <div id="ai_request" style="display:none;"> 451 <h2>AI ã«è³ªåãã</h2> 452 <div class='ai-request-form'> 453 <div class="form-center"> 454 <form class="ai-request-form" action="/getting_started" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="j-CUgS3ggkmaVPwsBsjIzRBG_rk-tveocESCdiCB1bzqX4l34xbSn4zQabKM2MYIZ_N6w5YEdo3rR62GOuOfeQ" autocomplete="off" /> 455 <div class="field"> 456 <i class="fa-regular fa-circle-exclamation fa-xs"></i> 457 <span class="ai-request-tooltip tooltip" data-tooltip="AI ã®åçãå¿ ãæ£ããããã§ã¯ããã¾ãããããã¾ã§ãã³ãã¨ãã¦ã使ããã ããã"></span> 458 <label style="margin-left: -23px" for="text">質åãéã£ã¦ã¿ãã</label><span id='text-count'>ï¼0/500æåï¼</span><br> 459 <textarea placeholder="å ¥åä¾: 460ãA server is already running.ã 461ãActiveRecord::PendingMigrationErrorã 462ãGemfile 㨠Gemfile.lock ã®éãã 463ããã¤ã°ã¬ã¼ã·ã§ã³ã£ã¦ä½ï¼ã" name="text" id="text"> 464</textarea> 465 </div> 466 <div class='ai-request-help'> 467 <a onclick="InputSample();" href="javascript:;"><i class='fad fa-vial-circle-check'></i> ãµã³ãã«æãå ¥åãã</a> 468 </div> 469 470 <div class="actions"> 471 <input type="submit" name="commit" value="質åãã" class="card-btn btn-red" data-disable-with="質åãã" /> 472 <button type="button" id='content-clear' class="btn btn-secondary">ãªã»ãããã</button> 473 </div> 474</form> <div class='answer'></div> 475 <div class='ai-feedback' style="margin-top: 1rem;"> 476 <div id="reaction-buttons" style="display: none;"> 477 <span>ãã®åçã¯ãå½¹ã«ç«ã¡ã¾ãããï¼</span> 478 <button class="reaction" id="positiveReaction" onclick="sendReaction('up')">ð</button> 479 <button class="reaction" id="negativeReaction" onclick="sendReaction('down')">ð</button> 480 </div> 481 <span class='thank-message' style='display: none'>ãã£ã¼ãããã¯ãããã¨ããããã¾ãã ð</span> 482 </div> 483 </div> 484 </div> 485 </div> 486 </div> 487</section> 488
489<script type='text/javascript'> 490 var currentIndex = 0; 491 492 function InputSample() { 493 var sampleArray = ["A server is already running.","ActiveRecord::PendingMigrationError","undefined method `id' for nil:NilClass","ActiveModel::ForbiddenAttributesError","ã¢ãã«ããã¥ã¼ãã³ã³ããã¼ã©ã¼ã®å½¹å²ãæãã¦","ãã¤ã°ã¬ã¼ã·ã§ã³ã£ã¦ä½ï¼","Gemfile 㨠Gemfile.lock ã®éã","HTTP ãªã¯ã¨ã¹ããåãããªã"] 494 var currentSample = sampleArray[currentIndex]; 495 currentIndex = (currentIndex + 1 < sampleArray.length) ? currentIndex + 1 : 0; 496 497 $('textarea[name="text"]').val(currentSample); 498 499 var count = $('textarea[name="text"]').val().length; 500 var maxinum = 500; 501 $('#text-count').html('ï¼' + count + '/' + maxinum + 'æåï¼'); 502 return false; 503 } 504 505 function sendReaction(reaction) { 506 $('#reaction-buttons').hide('fast'); 507 $.ajax({ 508 url: "/reaction", 509 type: "POST", 510 cache: false, 511 data: { reaction: reaction }, 512 headers: { 513 'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content') 514 }, 515 success: function(data) { 516 $('.thank-message').show('slow') 517 } 518 }); 519 return false; 520 } 521 522 $(function(){ 523 $("#content-clear").click(function() { 524 $('.ai-request-form .answer').hide(); 525 $('textarea[name="text"]').val(''); 526 $('#text-count').css("color", "gray"); 527 $('#text-count').html('ï¼0/500æåï¼'); 528 $('#reaction-buttons').hide(); 529 $('.thank-message').hide(); 530 }); 531 532 $('textarea[name="text"]').on('keyup', function(){ 533 var count = $('textarea[name="text"]').val().length; 534 var maxinum = 500; 535 $('#text-count').html('ï¼' + count + '/' + maxinum + 'æåï¼'); 536 if (count > maxinum){ 537 $('#text-count').css("color", "red"); 538 $('.actions > input').prop('disabled', true); 539 } 540 else if(count > 0 && count <= maxinum){ 541 $('#text-count').css("color", "grey"); 542 $('.actions > input').prop('disabled', false); 543 } 544 else if(count == 0){ 545 $('#text-count').css("color","gray"); 546 } 547 }) 548 549 $('.ai-request-form').submit(function(){ 550 $('.actions > input').prop('disabled', true); 551 var content = $('textarea[name="text"]').val(); 552 $('.ai-request-form .answer').html("<div class='loader'></div><span style='margin-left: 15px'>è§£æä¸â¦</span>") 553 $('.ai-request-form .answer').show('slow') 554 $('#reaction-buttons').hide(); 555 $('.thank-message').hide(); 556 $.ajax({ 557 type: "POST", 558 url: "/question", 559 cache: false, 560 data: { content: content, path: location.pathname+location.search}, 561 headers: { 562 'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content') 563 }, 564 success: function(data) { 565 content = data.answer.replace(/\r?\n/g, '<br>') 566 content = content.replace(/<pre>[\s\S]*?<\/pre>|<br>\s*<br>/g, function(match) { 567 return match.includes("<pre>") ? match : "<br>"; 568 }); 569 content = content.replace(/<br><html><body><br>/g, '<html><body>') 570 $('.ai-request-form .answer').html(content) 571 $('.actions > input').prop('disabled', false); 572 $('#reaction-buttons').show(); 573 } 574 }); 575 return false; 576 }); 577 }); 578</script>
578 579 580 581 <div style='margin-bottom: 100px;'> 582 583 <body class="guide"> 584 <div id="fb-root"></div> 585
585<script>(function(d, s, id) { 586 var js, fjs = d.getElementsByTagName(s)[0]; 587 if (d.getElementById(id)) return; 588 js = d.createElement(s); js.id = id; 589 js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=614116885378153&version=v2.0"; 590 fjs.parentNode.insertBefore(js, fjs); 591 }(document, 'script', 'facebook-jssdk')); 592 </script>
592 593 594 <!-- 595 <div id="topNav"> 596 <div class="wrapper"> 597 <strong class="more-info-label">é¢é£ãµã¤ã: </strong> 598 <span class="red-button more-info-button">é¢é£URL</span> 599 <ul class="more-info-links s-hidden"> 600 <li class="more-info"><a href="http://guides.rubyonrails.org/">åè (è±èª)</a></li> 601 <li class="more-info"><a href="https://github.com/yasslab/railsguides.jp">ã½ã¼ã¹ã³ã¼ã (GitHub)</a></li> 602 <li class="more-info"><a href="https://railstutorial.jp/">Railsãã¥ã¼ããªã¢ã«</a></li> 603 </ul> 604 </div> 605 </div> 606 --> 607 608 609 610 <hr class="hide"> 611 612 <div id="feature"> 613 614 <div class="wrapper"> 615 <h2>Rails ãã¯ãããã</h2> 616<p>ãã®ã¬ã¤ãã§ã¯ãRuby on Railsï¼ä»¥ä¸ãRailsï¼ãåãã¦è¨å®ãã¦å®è¡ããã¾ã§ã解説ãã¾ãã</p> 617<p>ãã®ã¬ã¤ãã®å 容:</p> 618<ul> 619<li>Railsã®ã¤ã³ã¹ãã¼ã«æ¹æ³ãæ°ããRailsã¢ããªã±ã¼ã·ã§ã³ã®ä½ææ¹æ³ãã¢ããªã±ã¼ã·ã§ã³ãããã¼ã¿ãã¼ã¹ã¸ã®æ¥ç¶æ¹æ³</li> 620<li>Railsã¢ããªã±ã¼ã·ã§ã³ã®ä¸è¬çãªã¬ã¤ã¢ã¦ã</li> 621<li>MVCï¼ã¢ãã«ã»ãã¥ã¼ã»ã³ã³ããã¼ã©ï¼ããã³RESTfulè¨è¨ã®åºç¤</li> 622<li>Railsã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ããã¼ããæè»½ã«çæããæ¹æ³</li> 623<li>使ããã¢ããªã±ã¼ã·ã§ã³ãKamalã§ãããã¤ããæ¹æ³</li> 624</ul> 625 626 <div id="subCol"> 627 <h3 class="chapter">ç®æ¬¡</h3> 628 <ol class="chapters"> 629<li><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">ã¯ããã«</a></li> 630<li><a href="#rails%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B">Railsã¨ã¯ä½ã</a></li> 631<li> 632<a href="#rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">Railsã¢ããªãæ°è¦ä½æãã</a> 633 634<ul> 635<li><a href="#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6">åææ¡ä»¶</a></li> 636<li><a href="#%E6%9C%80%E5%88%9D%E3%81%AErails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">æåã®Railsã¢ããªã±ã¼ã·ã§ã³ã使ãã</a></li> 637<li><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">ãã£ã¬ã¯ããªæ§é </a></li> 638<li><a href="#mvc%E3%81%AE%E5%9F%BA%E7%A4%8E">MVCã®åºç¤</a></li> 639</ul> 640</li> 641<li> 642<a href="#hello-rails-bang">Hello, Rails!</a> 643 644<ul> 645<li><a href="#%E9%96%8B%E7%99%BA%E4%B8%AD%E3%81%AE%E8%87%AA%E5%8B%95%E3%82%B3%E3%83%BC%E3%83%89%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF">éçºä¸ã®èªåã³ã¼ãèªã¿è¾¼ã¿</a></li> 646</ul> 647</li> 648<li> 649<a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">ãã¼ã¿ãã¼ã¹ã¢ãã«ã使ãã</a> 650 651<ul> 652<li><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">ãã¼ã¿ãã¼ã¹ã®ãã¤ã°ã¬ã¼ã·ã§ã³</a></li> 653<li><a href="#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">ãã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã</a></li> 654</ul> 655</li> 656<li><a href="#rails%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB">Railsã³ã³ã½ã¼ã«</a></li> 657<li> 658<a href="#active-record%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%9F%BA%E7%A4%8E">Active Recordã¢ãã«ã®åºç¤</a> 659 660<ul> 661<li><a href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">ã¬ã³ã¼ãã使ãã</a></li> 662<li><a href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%A7%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99">ã¬ã³ã¼ããã¯ã¨ãªã§åãåºã</a></li> 663<li><a href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88">ã¬ã³ã¼ãã®ãã£ã«ã¿ãªã³ã°ã¨ä¸¦ã¹æ¿ã</a></li> 664<li><a href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B">ã¬ã³ã¼ããæ¤ç´¢ãã</a></li> 665<li><a href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B">ã¬ã³ã¼ããæ´æ°ãã</a></li> 666<li><a href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">ã¬ã³ã¼ããåé¤ãã</a></li> 667<li><a href="#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">ããªãã¼ã·ã§ã³</a></li> 668</ul> 669</li> 670<li><a href="#rails%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E6%B5%81%E3%82%8C">Railsã®ãªã¯ã¨ã¹ãã®æµã</a></li> 671<li> 672<a href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">ã«ã¼ãã£ã³ã°</a> 673 674<ul> 675<li><a href="#url%E3%81%AE%E6%A7%8B%E6%88%90%E8%A6%81%E7%B4%A0">URLã®æ§æè¦ç´ </a></li> 676<li><a href="#http%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84">HTTPã¡ã½ããã¨ãã®ç®ç</a></li> 677<li><a href="#rails%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">Railsã®ã«ã¼ãã£ã³ã°</a></li> 678<li><a href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">ã«ã¼ãã£ã³ã°ã³ãã³ã</a></li> 679</ul> 680</li> 681<li> 682<a href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%A8%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3">ã³ã³ããã¼ã©ã¨ã¢ã¯ã·ã§ã³</a> 683 684<ul> 685<li><a href="#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">ãªã¯ã¨ã¹ãã使ãã</a></li> 686<li><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%A4%89%E6%95%B0">ã¤ã³ã¹ã¿ã³ã¹å¤æ°</a></li> 687<li><a href="#crud%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3">CRUDã¢ã¯ã·ã§ã³</a></li> 688<li><a href="#%E5%80%8B%E5%88%A5%E3%81%AE%E8%A3%BD%E5%93%81%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B">åå¥ã®è£½åã表示ãã</a></li> 689<li><a href="#%E8%A3%BD%E5%93%81%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">製åã使ãã</a></li> 690<li><a href="#%E8%A3%BD%E5%93%81%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B">製åãç·¨éãã</a></li> 691<li><a href="#%E8%A3%BD%E5%93%81%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">製åãåé¤ãã</a></li> 692</ul> 693</li> 694<li> 695<a href="#%E8%AA%8D%E8%A8%BC%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">èªè¨¼æ©è½ã追å ãã</a> 696 697<ul> 698<li><a href="#%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">ãã°ã¢ã¦ãæ©è½ã追å ãã</a></li> 699<li><a href="#%E8%AA%8D%E8%A8%BC%E3%81%AA%E3%81%97%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%82%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B">èªè¨¼ãªãã®ã¢ã¯ã»ã¹ã許å¯ãã</a></li> 700<li><a href="#%E8%AA%8D%E8%A8%BC%E6%B8%88%E3%81%BF%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E3%81%A0%E3%81%91%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B">èªè¨¼æ¸ã¿ã¦ã¼ã¶ã¼ã«ã ããªã³ã¯ã表示ãã</a></li> 701</ul> 702</li> 703<li><a href="#%E8%A3%BD%E5%93%81%E3%82%92%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AB%E4%B9%97%E3%81%9B%E3%82%8B">製åããã£ãã·ã¥ã«ä¹ãã</a></li> 704<li><a href="#%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92action-text%E3%81%A7%E3%83%AA%E3%83%83%E3%83%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%99%E3%82%8B">ãã£ã¼ã«ããAction Textã§ãªããããã¹ãã«ãã</a></li> 705<li><a href="#active-storage%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">Active Storageã§ãã¡ã¤ã«ã¢ãããã¼ãæ©è½ã追å ãã</a></li> 706<li><a href="#%E5%9B%BD%E9%9A%9B%E5%8C%96%EF%BC%88i18n%EF%BC%89">å½éåï¼I18nï¼</a></li> 707<li> 708<a href="#action-mailer%E3%81%A8%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5">Action Mailerã¨ã¡ã¼ã«éç¥</a> 709 710<ul> 711<li><a href="#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E5%9C%A8%E5%BA%AB%E3%83%88%E3%83%A9%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E6%A9%9F%E8%83%BD">åºæ¬çãªå¨åº«ãã©ããã³ã°æ©è½</a></li> 712<li><a href="#%E9%80%9A%E7%9F%A5%E3%81%AE%E8%B3%BC%E8%AA%AD%E8%80%85%E3%82%92%E8%A3%BD%E5%93%81%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">éç¥ã®è³¼èªè ã製åã«è¿½å ãã</a></li> 713<li><a href="#%E3%80%8C%E5%9C%A8%E5%BA%AB%E3%81%82%E3%82%8A%E3%80%8D%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E9%80%9A%E7%9F%A5%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">ãå¨åº«ãããã¡ã¼ã«ã«ããéç¥æ©è½ã追å ãã</a></li> 714<li><a href="#%E5%85%B1%E9%80%9A%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92concern%E3%81%AB%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B">å ±éã³ã¼ããconcernã«æ½åºãã</a></li> 715<li><a href="#%E9%80%9A%E7%9F%A5%E8%B3%BC%E8%AA%AD%E3%81%AE%E8%A7%A3%E9%99%A4%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">éç¥è³¼èªã®è§£é¤ãªã³ã¯ãã¡ã¼ã«ã«è¿½å ãã</a></li> 716</ul> 717</li> 718<li> 719<a href="#css%E3%81%A8javascript%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">CSSã¨JavaScriptã追å ãã</a> 720 721<ul> 722<li><a href="#propshaft">Propshaft</a></li> 723<li><a href="#importmap">importmap</a></li> 724<li><a href="#hotwire">Hotwire</a></li> 725</ul> 726</li> 727<li> 728<a href="#rails%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F">Railsã§ãã¹ããæ¸ã</a> 729 730<ul> 731<li><a href="#%E3%83%95%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%81%E3%83%A3">ãã£ã¯ã¹ãã£</a></li> 732<li><a href="#%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B">ã¡ã¼ã«éä¿¡ããã¹ããã</a></li> 733</ul> 734</li> 735<li><a href="#rubocop%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%BD%A2%E5%BC%8F%E3%82%92%E7%B5%B1%E4%B8%80%E3%81%99%E3%82%8B">RuboCopã§ã³ã¼ãã®å½¢å¼ãçµ±ä¸ãã</a></li> 736<li><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF">ã»ãã¥ãªãã£ãã§ãã¯</a></li> 737<li><a href="#github-actions%E3%81%A7ci%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">GitHub Actionsã§CIãå®è¡ãã</a></li> 738<li> 739<a href="#kamal%E3%81%A7production%E7%92%B0%E5%A2%83%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">Kamalã§productionç°å¢ã«ãããã¤ãã</a> 740 741<ul> 742<li><a href="#production%E7%92%B0%E5%A2%83%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">productionç°å¢ã§ã¦ã¼ã¶ã¼ã使ãã</a></li> 743<li><a href="#solid-queue%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B">Solid Queueã§ããã¯ã°ã©ã¦ã³ãã¸ã§ããå¦çãã</a></li> 744</ul> 745</li> 746<li><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97">ä»å¾ã®ã¹ããã</a></li> 747<li><a href="#%E9%96%A2%E9%80%A3%E3%83%AA%E3%83%B3%E3%82%AF">é¢é£ãªã³ã¯</a></li> 748</ol> 749 750 <!--
751 <div id="sideDarkmodeSwitch"> 752 <span><i class="far fa-moon"></i> ãã¼ã¯ã¢ã¼ã 753 <span class="label-beta"></span></span> 754 <input type="checkbox" id="darkmode_toggle_check" value="darkmode"/> 755 <label class="darkmode-toggle" for="darkmode_toggle_check" id="darkmode_status"></label> 756 </div> 757 --> 758 <div id="sponsor-pr" style="margin: 10px 0;text-align: center;"> 759 \\ <a href="#supporters">åè³ä¼æ¥</a>ããã®ãç¥ãã // 760 <!--åè³ã«èå³ããã°<a href="/sponsors">ã³ãã©</a>ã¸--> 761 </div> 762 <aside id="toppage"> 763 <div id="sponsor"> 764 <!-- Carbon Ads ãåè³ä¼æ¥ã®ç»åã表示ãããç®æ --> 765
765<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CE7ITK7L&placement=railsguidesjp" id="_carbonads_js"></script>
765 766 </div> 767 <ol class="snsb" style="margin-left: 0; margin-right: 0;"> 768 <li><a class="twitter-share-button" href="https://twitter.com/intent/tweet" data-hashtags="Railsã¬ã¤ã" data-via="RailsGuidesJP" data-related="RailsGuidesJP,YassLab" data-size="large" lang="ja"></a></li> 769 <li style="margin-left: 6px; margin-right: 0;"><a class="github-button" href="https://github.com/yasslab/railsguides.jp" data-size="large" data-show-count="true" aria-label="Star yasslab/railsguides.jp on GitHub">Star</a></li> 770 </ol> 771 </aside> 772 </div> 773 774 </div> 775 </div> 776 777 <div id="container"> 778 <div class="wrapper"> 779 <div id="mainCol"> 780 <h3 id="ã¯ããã«"><a class="anchorlink" href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">1 ã¯ããã«</a></h3> 781<p>Railsã®ä¸çã¸ãããã! æ¬ã¬ã¤ããRailsãã¯ãããããã§ã¯ãRailsãæ´»ç¨ãã¦Webã¢ããªã±ã¼ã·ã§ã³ãæ§ç¯ããã¨ãã®ä¸æ ¸ã¨ãªãæ¦å¿µã«ã¤ãã¦è§£èª¬ãã¾ããæ¬ã¬ã¤ããçè§£ããããã«ãRailsã®çµé¨ã¯å¿ è¦ããã¾ããã</p> 782<p>Railsã¯ãRubyããã°ã©ãã³ã°è¨èªç¨ã«æ§ç¯ãããWebãã¬ã¼ã ã¯ã¼ã¯ã§ããRailsã¯Rubyç¬èªã®ãã¾ãã¾ãªæ©è½ãæ´»ç¨ãã¦ããããããã®ã¬ã¤ãã§ç´¹ä»ããåºæ¬çãªç¨èªãèªå½ãçè§£ã§ããããã«ãäºåã«Rubyã®åºç¤ãå¦ç¿ãã¦ãããã¨ã<strong>å¼·ã</strong>ãªã¹ã¹ã¡ãã¾ãã</p> 783<ul> 784<li><a href="https://www.ruby-lang.org/ja/documentation/">ããã°ã©ãã³ã°è¨èªRubyå ¬å¼Webãµã¤ã</a></li> 785<li><a href="https://github.com/EbookFoundation/free-programming-books/blob/main/books/free-programming-books-ja.md#ruby">ããã°ã©ãã³ã°å¦ç¿ã³ã³ãã³ãã¾ã¨ã</a></li> 786</ul> 787<div class="info"><p>訳注ï¼Railsã¬ã¤ãã§ã¯éçºçµé¨è ãæ©ããã£ããã¢ããã§ãããããå¤ãã®ç¨èªèª¬æãçç¥ãã¦ãã¾ããèªãã§ãã¦ãé£ãããã¨æããå ´åã¯<a href="https://railstutorial.jp/">Railsãã¥ã¼ããªã¢ã«</a>ãããèªã¿ãã ããã</p></div> 788<h3 id="railsã¨ã¯ä½ã"><a class="anchorlink" href="#rails%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B">2 Railsã¨ã¯ä½ã</a></h3> 789<p>Railsã¨ã¯ãããã°ã©ãã³ã°è¨èªãRubyãã§æ¸ãããWebã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯ã§ããRailsã¯ãããããéçºè ãWebã¢ããªã±ã¼ã·ã§ã³éçºã§å¿ è¦ã¨ãªã使¥ããªã½ã¼ã¹ãäºåã«æ³å®ãããã¨ã§ãWebã¢ããªã±ã¼ã·ã§ã³ãããæè»½ã«éçºã§ããããã«è¨è¨ããã¦ãã¾ãã</p> 790<p>Railsã¯ãä»ã®å¤ãã®Webã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯ã¨æ¯è¼ãã¦ãã¢ããªã±ã¼ã·ã§ã³ãéçºããéã®ã³ã¼ãéãããå°ãªãã¦æ¸ãã«ãããããããããå¤ãã®æ©è½ãå®ç¾ã§ãã¾ããããã©ã³éçºè ã®å¤ãããRailsã®ãããã§Webã¢ããªã±ã¼ã·ã§ã³éçºãã¨ã¦ã楽ãããªã£ããã¨è¿°ã¹ã¦ãã¾ãã</p> 791<p>Railsã¯ãæåã®éçºæ¹æ³ã¯1ã¤ã§ãããã¨ãããããæå³å¤§èãªå¤æã«åºãã¦è¨è¨ããã¦ãã¾ããä½ããè¡ãããã®æåã®æ¹æ³ã1ã¤ä»®å®ãã¦ãããã«æ²¿ã£ãéçºãå ¨é¢çã«æ¯æ´ãã¾ããè¨ãæããã°ãRailsã§ä»®å®ããã¦ããªãå¥ã®éçºææ³ã¯è¡ãã«ãããªãã¾ãã</p> 792<p>ãã®ãRails Wayããããªãã¡ãRailsã¨ããã¬ã¼ã«ã«ä¹ã£ã¦éçºãããææ³ãå¦ãã 人ã¯ãéçºã®çç£æ§ãé©ãã»ã©åä¸ãããã¨ã«æ°ä»ãã§ããããéã«ãã¬ã¼ã«ã«ä¹ããã«å¾æ¥ã®éçºææ³ã«ãã ããã¨ãéçºã®æ¥½ãããæ¸ã£ã¦ãã¾ãããããã¾ããã</p> 793<p>Railsã®å²å¦ã«ã¯ã以ä¸ã®2ã¤ã®ä¸»è¦ãªåºæ¬ç念ãããã¾ãã</p> 794<ul> 795<li> 796<strong>ç¹°ãè¿ããé¿ããï¼Don't Repeat Yourself: DRYï¼:</strong> 797DRYã¯ã½ããã¦ã§ã¢éçºä¸ã®ååã§ããããã·ã¹ãã ãæ§æããç¥èã®ããããé¨åã¯ã常ã«åä¸ã§ãããæç¢ºã§ãããä¿¡é ¼ã§ããå½¢ã§è¡¨ç¾ããã¦ããªããã°ãªããªããã¨ãããã®ã§ããåãã³ã¼ããç¹°ãè¿ãæ¸ããã¨ãå¾¹åºçã«é¿ãããã¨ã§ãã³ã¼ããä¿å®ãããããªãã容æã«æ¡å¼µã§ããããã«ãªãããã°ãæ¸ããã¾ãã</li> 798<li> 799<strong>è¨å®ããè¦ç´ãåªå ï¼Convention Over Configurationï¼:</strong> 800Railsã§ã¯ãWebã¢ããªã±ã¼ã·ã§ã³ã®æ©è½ãå®ç¾ããæåã®æ¹æ³ãæç¢ºã«ç¤ºããã¦ãããWebã¢ããªã±ã¼ã·ã§ã³ã®å種è¨å®ã«ã¤ãã¦ã徿¥ã®çµé¨ãæ £ç¿ãå ã«ããããã®ããã©ã«ãå¤ãå®ãã¦ãã¾ããããã©ã«ãå¤ã決ã¾ã£ã¦ãããããã§ãéçºè ã®æè¦ããã¹ã¦åãå ¥ãããã¨ããèªç±éããWebã
800¢ããªã±ã¼ã·ã§ã³ã®ããã«ãéçºè ã大éã®è¨å®ãã¡ã¤ã«ãè¨å®ããã«æ¸ã¿ã¾ãã</li> 801</ul> 802<h3 id="railsã¢ããªãæ°è¦ä½æãã"><a class="anchorlink" href="#rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">3 Railsã¢ããªãæ°è¦ä½æãã</a></h3> 803<p>ããã§ã¯ãRailsã®çµã¿è¾¼ã¿æ©è½ã®ããã¤ãããã¢ã³ã¹ãã¬ã¼ã·ã§ã³ããã·ã³ãã«ãªeã³ãã¼ã¹ã¢ããªã<code>store</code>ã¨ããããã¸ã§ã¯ãåã§æ§ç¯ãã¾ãã</p> 804<div class="info"><p>ãã«è¨å·<code>$</code>ã§å§ã¾ãã³ãã³ãã¯ãã¿ã¼ããã«ã§å®è¡ããå¿ è¦ãããã¾ãã</p></div> 805<h4 id="åææ¡ä»¶"><a class="anchorlink" href="#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6">3.1 åææ¡ä»¶</a></h4> 806<p>ãã®ããã¸ã§ã¯ãã§ã¯ä»¥ä¸ã®ãã®ãå¿ è¦ã§ãã</p> 807<ul> 808<li>Ruby 3.2以é</li> 809<li>Rails 8.1.0以é</li> 810<li>ã³ã¼ãã¨ãã£ã¿</li> 811</ul> 812<p>RubyãRailsãã¤ã³ã¹ãã¼ã«ããå¿ è¦ãããå ´åã¯ã<a href="install_ruby_on_rails.html">Ruby on Rails ã¤ã³ã¹ãã¼ã«ã¬ã¤ã</a>ã«è¨è¼ããã¦ããæé ã«å¾ã£ã¦ãã ããã</p> 813<div class="info"><p>訳注ï¼GitHubãæä¾ããã¯ã©ã¦ãéçºç°å¢ã<a href="https://github.co.jp/features/codespaces">Codespaces</a>ãã®<a href="https://github.com/codespaces/templates">å ¬å¼Ruby on Railsãã³ãã¬ã¼ã</a>ã使ãã¨ãæ°ã¯ãªãã¯ã§Railsãåãããã¯ã©ã¦ãéçºç°å¢ãæã«å ¥ãã¾ããï¼åè: <a href="https://railstutorial.jp/docs/codespaces">GitHub Codespacesãå©ç¨ãã - Railsãã¥ã¼ããªã¢ã«</a>ï¼</p></div> 814<p>æ£ãããã¼ã¸ã§ã³ã®Railsãã¤ã³ã¹ãã¼ã«ããã¦ãããã¨ã確èªãã¦ããã¾ããããç¾å¨ã®ãã¼ã¸ã§ã³ã表示ããã«ã¯ãã¿ã¼ããã«ãéãã¦ä»¥ä¸ã®ã³ãã³ããå®è¡ããã¨ããã¼ã¸ã§ã³çªå·ãåºåããã¾ãã</p> 815<div class="code_container"> 816<pre class="highlight"> 817<span class="gp">$</span><span class="w"> </span>rails <span class="nt">--version</span> 818<span class="go">Rails 8.1.0 819</span> 820</pre> 821</div> 822<p>ãã¼ã¸ã§ã³çªå·ã¯Rails 8.1.0以éã«ãªãã¯ãã§ãã</p> 823<h4 id="æåã®railsã¢ããªã±ã¼ã·ã§ã³ã使ãã"><a class="anchorlink" href="#%E6%9C%80%E5%88%9D%E3%81%AErails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">3.2 æåã®Railsã¢ããªã±ã¼ã·ã§ã³ã使ãã</a></h4> 824<p>Railsã«ã¯ã使¥ã楽ã«ããããã®ãã¾ãã¾ãªã³ãã³ããä»å±ãã¦ãã¾ãã 825å©ç¨å¯è½ãªã³ãã³ãããã¹ã¦è¡¨ç¤ºããã«ã¯ã<code>rails --help</code>ãå®è¡ãã¾ãã</p> 826<p><code>rails new</code>ã³ãã³ãã¯ãæ°ããRailsã¢ããªã±ã¼ã·ã§ã³ã®åºç¤ãçæããã®ã§ãã¾ããã®ã³ãã³ããå®è¡ãããã¨ããå§ãã¾ãããã</p> 827<p><code>store</code>ã¢ããªã±ã¼ã·ã§ã³ã使ããã«ã¯ãã¿ã¼ããã«ã§ä»¥ä¸ã®ã³ãã³ããå®è¡ãã¾ãã</p> 828<div class="code_container"> 829<pre class="highlight"> 830<span class="gp">$</span><span class="w"> </span>rails new store 831</pre> 832</div> 833<div class="note"><p><code>rails new</code>ã³ãã³ãã«ãã©ã°ã追å ããã¨ãRailsãçæããã¢ããªã±ã¼ã·ã§ã³ãã«ã¹ã¿ãã¤ãºã§ãã¾ããå©ç¨å¯è½ãªãªãã·ã§ã³ããã¹ã¦è¡¨ç¤ºããã«ã¯ã<code>rails new --help</code>ãå®è¡ãã¾ãã</p></div> 834<p>æ°ããã¢ããªã±ã¼ã·ã§ã³ã使ãããããã®ãã£ã¬ã¯ããªã«ç§»åãã¾ãã</p> 835<div class="code_container"> 836<pre class="highlight"> 837<span class="gp">$</span><span class="w"> </span><span class="nb">cd </span>store 838</pre> 839</div> 840<h4 id="ãã£ã¬ã¯ããªæ§é "><a class="anchorlink" href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">3.3 ãã£ã¬ã¯ããªæ§é </a></h4> 841<p>æ°ããRailsã¢ããªã±ã¼ã·ã§ã³ã«å«ã¾ãããã¡ã¤ã«ã¨ãã£ã¬ã¯ããªãå°ãè¦ã¦ã¿ã¾ãããããã®ãã©ã«ããã³ã¼ãã¨ãã£ã¿ã§éãããã¿ã¼ããã«ã§<code>ls -la</code>ãå®è¡ãã¦ãã¡ã¤ã«ã¨ãã£ã¬ã¯ããªã確èªã§ãã¾ãã</p> 842<table> 843<thead> 844<tr> 845<th>ãã¡ã¤ã«/ãã©ã«ã</th> 846<th>ç®ç</th> 847</tr> 848</thead> 849<tbody> 850<tr> 851<td>app/</td> 852<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®ã³ã³ããã¼ã©ãã¢ãã«ããã¥ã¼ããã«ãã¼ãã¡ã¼ã©ã¼ãã¸ã§ããããã¦ã¢ã»ãããç½®ããã¾ãã以å¾ãæ¬ã¬ã¤ãã§ã¯åºæ¬çã«ãã®ãã£ã¬ã¯ããªãä¸å¿ã«èª¬æãè¡ãã¾ãã</td> 853</tr> 854<tr> 855<td>bin/</td> 856<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ãèµ·åãã<code>rails</code>ã¹ã¯ãªãããç½®ããã¾ããã»ããã¢ããã»ã¢ãããã¼ãã»ãããã¤ã«ä½¿ãã¹ã¯ãªãããã¡ã¤ã«ãããã«ç½®ãã¾ãã</td> 857</tr> 858<tr> 859<td>config/</td> 860<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®å種è¨å®ãã¡ã¤ã«ï¼
860ã«ã¼ãã£ã³ã°ããã¼ã¿ãã¼ã¹ãªã©ï¼ãç½®ããã¾ãã詳ããã¯<a href="configuring.html">Rails ã¢ããªã±ã¼ã·ã§ã³ã®è¨å®é ç®</a>ãåç §ãã¦ãã ããã</td> 861</tr> 862<tr> 863<td>config.ru</td> 864<td>Rackãã¼ã¹ã®ãµã¼ãã¼ã§ã¢ããªã±ã¼ã·ã§ã³ã®èµ·åã«ä½¿ããã<a href="https://rack.github.io">Rack</a>è¨å®ãã¡ã¤ã«ã§ãã</td> 865</tr> 866<tr> 867<td>db/</td> 868<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãç¾å¨ã®ãã¼ã¿ãã¼ã¹ã¹ãã¼ãã¨ããã¼ã¿ãã¼ã¹ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ãç½®ããã¾ãã</td> 869</tr> 870<tr> 871<td>Dockerfile</td> 872<td>Dockerã®è¨å®ãã¡ã¤ã«ã§ãã</td> 873</tr> 874<tr> 875<td>Gemfile<br>Gemfile.lock</td> 876<td>ãããã®ãã¡ã¤ã«ã¯ãRailsã¢ããªã±ã¼ã·ã§ã³ã§å¿ è¦ã¨ãªãgemã®ä¾åé¢ä¿ãè¨è¿°ãã¾ãããã®2ã¤ã®ãã¡ã¤ã«ã¯<a href="https://bundler.io">Bundler</a> gemã§ä½¿ããã¾ãã</td> 877</tr> 878<tr> 879<td>lib/</td> 880<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ãæ¡å¼µã¢ã¸ã¥ã¼ã«ãç½®ããã¾ãã</td> 881</tr> 882<tr> 883<td>log/</td> 884<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®ãã°ãã¡ã¤ã«ãç½®ããã¾ãã</td> 885</tr> 886<tr> 887<td>public/</td> 888<td>éçãªãã¡ã¤ã«ãã³ã³ãã¤ã«æ¸ã¿ã¢ã»ããã¯ããã«ç½®ãã¾ãããã®ãã£ã¬ã¯ããªã«ãããã¡ã¤ã«ã¯ãå¤é¨ï¼ã¤ã³ã¿ã¼ãããï¼ã«ãã®ã¾ã¾å ¬éããã¾ãã</td> 889</tr> 890<tr> 891<td>Rakefile</td> 892<td>ãã®ãã¡ã¤ã«ã¯ãã³ãã³ãã©ã¤ã³ããå®è¡ã§ããã¿ã¹ã¯ãæ¢ç´¢ãã¦èªã¿è¾¼ã¿ã¾ãããã®ã¿ã¹ã¯å®ç¾©ã¯ãRailså ¨ä½ã®ã³ã³ãã¼ãã³ãã«å¯¾ãã¦å®ç¾©ããã¾ããç¬èªã®Rakeã¿ã¹ã¯ãå®ç¾©ãããå ´åã¯ã<code>Rakefile</code>ã«ç´æ¥æ¸ãã¨æ¨©éãå¼·ãããã®ã§ããªãã¹ã<code>lib/tasks</code>ãã©ã«ãã®ä¸ã«Rakeç¨ã®ãã¡ã¤ã«ã追å ãã¦ãã ããã</td> 893</tr> 894<tr> 895<td>README.md</td> 896<td>ã¢ããªã±ã¼ã·ã§ã³ã®æ¦è¦ãç°¡æ½ã«èª¬æããããã¥ã¢ã«ãããã«è¨å ¥ãã¾ãããã®ãã¡ã¤ã«ã«ã¯ã¢ããªã±ã¼ã·ã§ã³ã®è¨å®æ¹æ³ãªã©ãè¨å ¥ããããããèªãã°èª°ã§ãã¢ããªã±ã¼ã·ã§ã³ãæ§ç¯ã§ããããã«ãã¦ããã¾ãããã</td> 897</tr> 898<tr> 899<td>script/</td> 900<td>ä½¿ãæ¨ã¦ã®ãã¾ãã¯æ±ç¨ã®<a href="https://github.com/rails/rails/blob/main/railties/lib/rails/generators/rails/script/USAGE">ã¹ã¯ãªãã</a>ã<a href="https://github.com/rails/rails/blob/main/railties/lib/rails/generators/rails/benchmark/USAGE">ãã³ããã¼ã¯</a>ãããã«ç½®ãã¾ãã</td> 901</tr> 902<tr> 903<td>storage/</td> 904<td>ãã®ãã£ã¬ã¯ããªã«ã¯ããã£ã¹ã¯ãµã¼ãã¹ç¨ã®SQLiteãã¼ã¿ãã¼ã¹ãã¡ã¤ã«ãActive Storageãã¡ã¤ã«ãç½®ããã¾ãã詳ããã¯<a href="active_storage_overview.html">Active Storageã®æ¦è¦</a>ãåç §ãã¦ãã ããã</td> 905</tr> 906<tr> 907<td>test/</td> 908<td>ãã®ãã£ã¬ã¯ããªã«ã¯ãåä½ãã¹ãããã£ã¯ã¹ãã£ãªã©ã®ãã¹ãé¢é£ãã¡ã¤ã«ãç½®ãã¾ãããã¹ãã«ã¤ãã¦è©³ããã¯<a href="testing.html">Railsã¢ããªã±ã¼ã·ã§ã³ããã¹ããã</a>ãåç §ãã¦ãã ããã</td> 909</tr> 910<tr> 911<td>tmp/</td> 912<td>ãã®ãã£ã¬ã¯ããªã«ã¯ããã£ãã·ã¥ãpidãªã©ã®ä¸æãã¡ã¤ã«ãç½®ããã¾ãã</td> 913</tr> 914<tr> 915<td>vendor/</td> 916<td>ãµã¼ããã¼ãã£è£½ã³ã¼ãã¯ãã¹ã¦ãã®ãã£ã¬ã¯ããªã«ç½®ãã¾ããé常ã®Railsã¢ããªã±ã¼ã·ã§ã³ã®å ´åãå¤é¨ã®gemãã¡ã¤ã«ãããã«ç½®ããã¾ãã</td> 917</tr> 918<tr> 919<td>.dockerignore</td> 920<td>ã³ã³ããã«ã³ãã¼ãã¹ãã§ãªããã¡ã¤ã«ãDockerã«æç¤ºããã®ã«ä½¿ããã¡ã¤ã«ã§ãã</td> 921</tr> 922<tr> 923<td>.gitattributes</td> 924<td>ãã®ãã¡ã¤ã«ã¯ãgitãªãã¸ããªå ã®ç¹å®ã®ãã¹ã«ã¤ãã¦ã¡ã¿ãã¼ã¿ãå®ç¾©ãã¾ãããã®ã¡ã¿ãã¼ã¿ã¯ãgitãä»ã®ãã¼ã«ã§æ¯ãèããæ¡å¼µã§ãã¾ãã詳ããã¯<a href="https://git-scm.com/docs/gitattributes">gitattributesããã¥ã¡ã³ã</a>ãåç §ãã¦ãã ããã</td> 925</tr> 926<tr> 927<td>.github/</td> 928<td>GitHubåºæã®ãã¡ã¤ã«ãç½®ããã¾ãã</td> 929</tr> 930<tr> 931<td>.gitignore</td> 932<td>
932Gitã«ç»é²ããªããã¡ã¤ã«ï¼ã¾ãã¯ãã¿ã¼ã³ï¼ããã®ãã¡ã¤ã«ã§æå®ãã¾ããGitã«ãã¡ã¤ã«ãç»é²ããªãæ¹æ³ã«ã¤ãã¦è©³ããã¯<a href="https://help.github.com/articles/ignoring-files">GitHub - Ignoring files</a>ãåç §ãã¦ãã ããã</td> 933</tr> 934<tr> 935<td>.kamal/</td> 936<td>Kamalã®ç§å¯éµã¨ãããã¤ç¨ããã¯ãå«ã¾ãã¾ãã</td> 937</tr> 938<tr> 939<td>.rubocop.yml</td> 940<td>ãã®ãã¡ã¤ã«ã«ã¯RuboCopç¨ã®è¨å®ãå«ã¾ãã¾ãã</td> 941</tr> 942<tr> 943<td>.ruby-version</td> 944<td>ãã®ãã¡ã¤ã«ã«ã¯ãããã©ã«ãã®Rubyãã¼ã¸ã§ã³ãè¨è¿°ããã¦ãã¾ãã</td> 945</tr> 946</tbody> 947</table> 948<h4 id="mvcã®åºç¤"><a class="anchorlink" href="#mvc%E3%81%AE%E5%9F%BA%E7%A4%8E">3.4 MVCã®åºç¤</a></h4> 949<p>Railsã®ã³ã¼ãã¯ã<a href="https://ja.wikipedia.org/wiki/Model_View_Controller">MVCï¼Model-View-Controllerï¼</a>ã¢ã¼ããã¯ãã£ã«åºã¥ãã¦ç·¨æããã¦ãã¾ããMVCã§ã¯ãã³ã¼ãã®å¤§é¨åã以ä¸ã®3ã¤ã®ä¸»è¦ãªæ¦å¿µã«åºã¥ãã¦é ç½®ããã¾ãã</p> 950<ul> 951<li> 952<strong>ã¢ãã«</strong>: ã¢ããªã±ã¼ã·ã§ã³å ã®ãã¼ã¿ï¼é常ã¯ãã¼ã¿ãã¼ã¹ã®ãã¼ãã«ï¼ã管çãã¾ãã</li> 953<li> 954<strong>ãã¥ã¼</strong>: ã¬ã¹ãã³ã¹ãHTMLãJSONãXMLãªã©ã®ãã¾ãã¾ãªå½¢å¼ã§ã¬ã³ããªã³ã°ãã¾ãã</li> 955<li> 956<strong>ã³ã³ããã¼ã©</strong>: ã¦ã¼ã¶ã¼æä½ãåãªã¯ã¨ã¹ãã®ãã¸ãã¯ãå¦çãã¾ãã</li> 957</ul> 958<p><img src="/railsguides/images/getting_started/mvc_architecture_light.jpg" alt="MVCã¢ã¼ããã¯ãã£ã®å³" data-src="/railsguides/images/getting_started/mvc_architecture_light.jpg" class="lazyload" loading="lazy"></p> 959<p>MVCã®åºæ¬é¨åãçè§£ããã®ã§ãMVCãã©ã®ããã«Railsã§ä½¿ãããããè¦ã¦ã¿ã¾ãããã</p> 960<h3 id="hello-rails-bang"><a class="anchorlink" href="#hello-rails-bang">4 Hello, Rails!</a></h3> 961<p>ããã§ã¯ãRailsã®ãã¼ã¿ãã¼ã¹ã使ãã¦ãRailsãµã¼ãã¼ãåãã¦èµ·åãã¦ã¿ã¾ãããã</p> 962<p>ã¿ã¼ããã«ã§<code>store</code>ãã£ã¬ã¯ããªã«ç§»åãã以ä¸ã®ã³ãã³ããå®è¡ãã¾ãã</p> 963<div class="code_container"> 964<pre class="highlight"> 965<span class="gp">$</span><span class="w"> </span>bin/rails db:create 966</pre> 967</div> 968<p>ããã§ãã¢ããªã±ã¼ã·ã§ã³ã®åæãã¼ã¿ãã¼ã¹ã使ããã¾ããã 969ç¶ãã¦ãRailsãµã¼ãã¼ãèµ·åãã¾ãã</p> 970<div class="code_container"> 971<pre class="highlight"> 972<span class="gp">$</span><span class="w"> </span>bin/rails server 973</pre> 974</div> 975<div class="note"><p>Railsã³ãã³ããã¢ããªã±ã¼ã·ã§ã³ãã£ã¬ã¯ããªå ã§å®è¡ããã¨ãã¯ãåç¬ã®<code>rails</code>ããã<code>bin/rails</code>ã使ãããã«ãã¾ããããããã«ããããã®ã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ããã¦ããRailsã®ãã¼ã¸ã§ã³ã確å®ã«ä½¿ããã¾ãã</p></div> 976<p>ããã¨ãPumaã¨ããWebãµã¼ãã¼ãèµ·åãã¾ããPumaãµã¼ãã¼ã¯ãéçãã¡ã¤ã«ãRailsã¢ããªã±ã¼ã·ã§ã³ã®é ä¿¡ãæ å½ãã¾ãã</p> 977<div class="code_container"> 978<pre class="highlight"> 979<span class="gp">=></span><span class="w"> </span>Booting Puma 980<span class="gp">=></span><span class="w"> </span>Rails 8.1.0 application starting <span class="k">in </span>development 981<span class="gp">=></span><span class="w"> </span>Run <span class="sb">`</span>bin/rails server <span class="nt">--help</span><span class="sb">`</span> <span class="k">for </span>more startup options 982<span class="go">Puma starting in single mode... 983* Puma version: 6.4.3 (ruby 3.3.5-p100) ("The Eagle of Durango") 984* Min threads: 3 985* Max threads: 3 986* Environment: development 987* PID: 12345 988* Listening on http://127.0.0.1:3000 989* Listening on http://[::1]:3000 990Use Ctrl-C to stop 991</span> 992</pre> 993</div> 994<p>Railsã¢ããªã±ã¼ã·ã§ã³ã表示ãã¦ã¿ã¾ãããã 995ãã©ã¦ã¶ã§<code>http://localhost:3000</code>ãéãã¨ãããã©ã«ãã®Railsã¦ã§ã«ã«ã ãã¼ã¸ã表示ããã¾ãã</p> 996<p><img src="/railsguides/images/getting_started/rails_welcome.png" alt="Railsèµ·åãã¼ã¸ã®ã¹ã¯ãªã¼ã³ã·ã§ãã" data-src="/railsguides/images/getting_started/rails_welcome.png" class="lazyload" loading="lazy"></p> 997<p>åãã¾ããï¼</p> 998<p>Railsã®èµ·åãã¼ã¸ã¯ãæ°ããRailsã¢ããªã±ã¼ã·ã§ã³ã®ãã¹ã¢ã¼ã¯ãã¹ããã¨ãã¦ä½¿ãã¾ãããã®ãã¼ã¸ã表示ãããã°ããµã¼ãã¼ãæ£å¸¸ã«åä½ãã¦ãããã¨ã確èªã§ãã¾ãã</p> 999<p>å®è¡ããã¦ããã¿ã¼ããã«ã®ã¦ã£ã³ãã¦ã§Ctrl + Cãã¼ãæ¼ãã°ããã¤ã§ãWebã
999µã¼ãã¼ã忢ã§ãã¾ãã</p> 1000<h4 id="éçºä¸ã®èªåã³ã¼ãèªã¿è¾¼ã¿"><a class="anchorlink" href="#%E9%96%8B%E7%99%BA%E4%B8%AD%E3%81%AE%E8%87%AA%E5%8B%95%E3%82%B3%E3%83%BC%E3%83%89%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF">4.1 éçºä¸ã®èªåã³ã¼ãèªã¿è¾¼ã¿</a></h4> 1001<p>éçºè ã®å¹¸ç¦ã¯Railsã®åºæ¬çãªå²å¦ã§ãããéçºä¸ã«ã³ã¼ããèªåã§åèªã¿è¾¼ã¿ããæ©è½ã¯ããããå®ç¾ããæ¹æ³ã®1ã¤ã§ãã</p> 1002<p>Railsãµã¼ãã¼ãèµ·åããã¨ãæ°ãããã¡ã¤ã«ãæ¢åã®ãã¡ã¤ã«ã¸ã®å¤æ´ãæ¤åºãããå®è¡ä¸ãå¿ è¦ã«å¿ãã¦ã³ã¼ãã®èªã¿è¾¼ã¿ãåèªã¿è¾¼ã¿ãèªåçã«è¡ããã¾ããããã«ãããã³ã¼ã夿´ã®ãã³ã«Railsãµã¼ãã¼ãåèµ·åããªãã¦ãæ¸ãã®ã§ãã¢ããªã®æ§ç¯ã«éä¸ã§ãã¾ãã</p> 1003<p>ã¾ããRailsã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãä»ã®ããã°ã©ãã³ã°è¨èªã§è¦ããããããª<code>require</code>ã¹ãã¼ãã¡ã³ããã»ã¨ãã©ä½¿ããã¦ããªããã¨ã«ãæ°ä»ãã§ããããRailsã§ã¯å½åè¦åã«åºã¥ãã¦ãã¡ã¤ã«ãèªåçã«<code>require</code>ããã®ã§ãã¢ããªã±ã¼ã·ã§ã³ã³ã¼ãã®è¨è¿°ã«éä¸ã§ãã¾ãã</p> 1004<p>詳ããã¯å¥ã¬ã¤ãã<a href="autoloading_and_reloading_constants.html">Railsã®èªåèªã¿è¾¼ã¿ã¨åèªã¿è¾¼ã¿</a>ããåç §ãã¦ãã ããã</p> 1005<h3 id="ãã¼ã¿ãã¼ã¹ã¢ãã«ã使ãã"><a class="anchorlink" href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">5 ãã¼ã¿ãã¼ã¹ã¢ãã«ã使ãã</a></h3> 1006<p>Railsã®<a href="active_record_basics.html">Active Record</a>ã¯ããªã¬ã¼ã·ã§ãã«ãã¼ã¿ãã¼ã¹ãRubyã³ã¼ãã«ãããã³ã°ããæ©è½ã§ããããã¼ãã«ãã¬ã³ã¼ãã®ä½æãæ´æ°ãåé¤ãªã©ããã¼ã¿ãã¼ã¹ãæä½ããããã®æ§é åã¯ã¨ãªè¨èªï¼SQLï¼ãçæããã®ã«å½¹ç«ã¡ã¾ãã</p> 1007<p>ãã®storeã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãRailsã®ããã©ã«ãã§ããSQLiteããªã¬ã¼ã·ã§ãã«ãã¼ã¿ãã¼ã¹ã¨ãã¦ä½¿ã£ã¦ãã¾ãã</p> 1008<p>ããã§ã¯ããã®Railsã¢ããªã±ã¼ã·ã§ã³ã«ãã¼ã¿ãã¼ã¹ãã¼ãã«ã追å ãã¦ãã·ã³ãã«ãª eã³ãã¼ã¹ã¹ãã¢ã«è£½åã追å ã§ããããã«ãã¦ã¿ã¾ãããã</p> 1009<div class="code_container"> 1010<pre class="highlight"> 1011<span class="gp">$</span><span class="w"> </span>bin/rails generate model Product name:string 1012</pre> 1013</div> 1014<p>ãã®ã³ãã³ãã¯ããã¼ã¿ãã¼ã¹ã«<code>string</code>åã®<code>name</code>ã«ã©ã ãæã¤<code>Product</code>ã¨ããååã®ã¢ãã«ãçæããããã«Railsã«æç¤ºãã¾ããä»ã®ã«ã©ã åã追å ããæ¹æ³ã«ã¤ãã¦ã¯ãã®å¾ã§å¦ç¿ãã¾ãã</p> 1015<p>ã³ãã³ããå®è¡ããã¨ãã¿ã¼ããã«ã«æ¬¡ã®å 容ã表示ããã¾ãã</p> 1016<div class="code_container"> 1017<pre class="highlight"> 1018<span class="go"> invoke active_record 1019 create db/migrate/20240426151900_create_products.rb 1020 create app/models/product.rb 1021 invoke test_unit 1022 create test/models/product_test.rb 1023 create test/fixtures/products.yml 1024</span> 1025</pre> 1026</div> 1027<p>ãã®ã³ãã³ãã¯ä»¥ä¸ãè¡ãã¾ãã</p> 1028<ol> 1029<li> 1030<code>db/migrate</code>ãã©ã«ãã®ä¸ã«ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ã使ã</li> 1031<li> 1032<code>app/models/product.rb</code>ã¨ããActive Recordã¢ãã«ã使ã</li> 1033<li>ãã®ã¢ãã«ã§ä½¿ããã¹ããã¡ã¤ã«ã¨ãã£ã¯ã¹ãã£ï¼fixtureï¼ãã¡ã¤ã«ã使ã</li> 1034</ol> 1035<div class="note"><p>Railsã®ã¢ãã«åã«ã¯è±èªã®<strong>åæ°å½¢</strong>ã使ãã¾ããããã¯ãã¤ã³ã¹ã¿ã³ã¹åãããã¢ãã«ã¯ãã¼ã¿ãã¼ã¹å ã®1ä»¶ã®ã¬ã³ã¼ãã表ãï¼ãã¼ã¿ãã¼ã¹ã«1åã®è£½åï¼a productï¼ã追å ããï¼ã¨ããèãã«åºã¥ãã¦ãã¾ãã</p></div> 1036<h4 id="ãã¼ã¿ãã¼ã¹ã®ãã¤ã°ã¬ã¼ã·ã§ã³"><a class="anchorlink" href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">5.1 ãã¼ã¿ãã¼ã¹ã®ãã¤ã°ã¬ã¼ã·ã§ã³</a></h4> 1037<p><strong>ãã¤ã°ã¬ã¼ã·ã§ã³</strong>ï¼migrationï¼ã¨ã¯ããã¼ã¿ãã¼ã¹ã«å¯¾ãã¦è¡ãä¸é£ã®å¤æ´ã®ãã¨ã§ã
1037ã</p> 1038<p>ãã¤ã°ã¬ã¼ã·ã§ã³ãå®ç¾©ãããã¨ã§ããã¼ã¿ãã¼ã¹ã®ãã¼ãã«ãã«ã©ã ãããã³ãã®ä»ã®å±æ§ã追å ã»å¤æ´ã»åé¤ããããã«ãã¼ã¿ãã¼ã¹ã夿´ããæ¹æ³ãçµ±ä¸ãããå½¢ã§Railsã«æç¤ºãã¾ãã 1039ããã«ãããèªåã®ã³ã³ãã¥ã¼ã¿ä¸ã§ã®éçºä¸ã«è¡ã£ããã¼ã¿ãã¼ã¹å¤æ´ããã©ããã³ã°ãã¦ãproductionç°å¢ã«å®å ¨ã«ãããã¤ã§ããããã«ãã¾ãã</p> 1040<p>Railsã使ãããã¤ã°ã¬ã¼ã·ã§ã³ãã³ã¼ãã¨ãã£ã¿ã§éãã¦ããã¤ã°ã¬ã¼ã·ã§ã³ã§ä½ãè¡ããããã確èªãã¦ã¿ã¾ãããã</p> 1041<div class="note"><p>以å¾ã®ãã¡ã¤ã«ã®åé ã«ã¯ãèªã¿ãããã®ãããã¡ã¤ã«ãã¹ãã³ã¡ã³ãã§è¿½å ãã¦ããã¾ãã</p></div> 1042<div class="code_container"> 1043<pre class="highlight"> 1044<span class="c1"># db/migrate/<ã¿ã¤ã ã¹ã¿ã³ã>_create_products.rb</span> 1045<span class="k">class</span> <span class="nc">CreateProducts</span> <span class="o"><</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Migration</span><span class="p">[</span><span class="mf">8.1</span><span class="p">]</span> 1046 <span class="k">def</span> <span class="nf">change</span> 1047 <span class="n">create_table</span> <span class="ss">:products</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span> 1048 <span class="n">t</span><span class="p">.</span><span class="nf">string</span> <span class="ss">:name</span> 1049 1050 <span class="n">t</span><span class="p">.</span><span class="nf">timestamps</span> 1051 <span class="k">end</span> 1052 <span class="k">end</span> 1053<span class="k">end</span> 1054</pre> 1055</div> 1056<p>ãã®ãã¤ã°ã¬ã¼ã·ã§ã³ã¯ãRailsã«<code>products</code>ã¨ããæ°ãããã¼ã¿ãã¼ã¹ãã¼ãã«ã使ããããæç¤ºãã¦ãã¾ãã</p> 1057<div class="note"><p>ã¢ãã«åã¯<code>Product</code>ã®ããã«<strong>åæ°å½¢</strong>ã使ãã¾ããããã¼ã¿ãã¼ã¹ãã¼ãã«åã¯<code>products</code>ã®ããã«<strong>è¤æ°å½¢</strong>ã使ã£ã¦ããç¹ã«ã注ç®ãã ãããããã¯ããã¼ã¿ãã¼ã¹ã¯åã¢ãã«ã®ããã¹ã¦ã®ãã¤ã³ã¹ã¿ã³ã¹ãä¿æããï¼ã¤ã¾ãã製åã®éã¾ãï¼productsï¼ã®ãã¼ã¿ãã¼ã¹ã使ãã¦ããï¼ã¨ããèãæ¹ã«åºã¥ãã¦ãã¾ãã</p></div> 1058<p>次ã®<code>create_table</code>ãããã¯ã¯ããã®ãã¼ã¿ãã¼ã¹ãã¼ãã«ã§å®ç¾©ããã«ã©ã ã¨åãå®ç¾©ãã¾ãã</p> 1059<ul> 1060<li><p><code>t.string :name</code>: <code>products</code>ãã¼ãã«ã«<code>name</code>ã¨ããã«ã©ã ã使ããåã<code>string</code>ã«è¨å®ããããRailsã«æç¤ºãã¾ãã</p></li> 1061<li><p><code>t.timestamps</code>: ã¢ãã«ã«<code>created_at:datetime</code>ã¨<code>updated_at:datetime</code>ã®2ã¤ã®ã«ã©ã ãä¸åº¦ã«å®ç¾©ããã·ã§ã¼ãã«ããã§ãã 1062ãããã®ã«ã©ã ã¯ãRailsã®ã»ã¨ãã©ã®Active Recordã¢ãã«ã§è¡¨ç¤ºãããã¬ã³ã¼ãã®ä½ææãæ´æ°æã«Active Recordã«ãã£ã¦èªåçã«å¤ãè¨å®ããã¾ãã</p></li> 1063</ul> 1064<h4 id="ãã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã"><a class="anchorlink" href="#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">5.2 ãã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã</a></h4> 1065<p>ãã¼ã¿ãã¼ã¹ã«å¯¾ãã¦è¡ã夿´ãå®ç¾©ãããã以ä¸ã®ã³ãã³ãã使ã£ã¦ãã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã¾ãã</p> 1066<div class="code_container"> 1067<pre class="highlight"> 1068<span class="gp">$</span><span class="w"> </span>bin/rails db:migrate 1069</pre> 1070</div> 1071<p>ãã®<code>bin/rails db:migrate</code>ã³ãã³ãã¯ãæ°ãããã¤ã°ã¬ã¼ã·ã§ã³ããã§ãã¯ãã¦ãã¼ã¿ãã¼ã¹ã«é©ç¨ãã¾ãã</p> 1072<p>å®è¡çµæã¯ä»¥ä¸ã®ãããªæãã«ãªãã¾ãã</p> 1073<div class="code_container"> 1074<pre class="highlight"> 1075<span class="go">== 20240426151900 CreateProducts: migrating =================================== 1076-- create_table(:products) 1077</span><span class="gp"> -></span><span class="w"> </span>0.0030s 1078<span class="go">== 20240426151900 CreateProducts: migrated (0.0031s) ========================== 1079</span> 1080</pre> 1081</div> 1082<div class="info"><p>å®è¡ãããã¤ã°ã¬ã¼ã·ã§ã³ã«èª¤ãããã£ãå ´åã¯ã<code>bin/rails db:rollback</code>ãå®è¡ãããã¨ã§ç´åã®ãã¤ã°ã¬ã¼ã·ã§ã³ã«æ»ãã¾ãã</p></div>
1083<h3 id="railsã³ã³ã½ã¼ã«"><a class="anchorlink" href="#rails%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB">6 Railsã³ã³ã½ã¼ã«</a></h3> 1084<p><code>products</code>ãã¼ãã«ã使ãããã®ã§ãRailsã§æä½ã§ããããã«ãªãã¾ããã 1085ãã£ãã試ãã¦ã¿ã¾ãããã</p> 1086<p>ããã§ã¯ã<strong>Railsã³ã³ã½ã¼ã«</strong>ã¨å¼ã°ããæ©è½ã使ãã¾ããRailsã³ã³ã½ã¼ã«ã¯ãRailsã¢ããªã±ã¼ã·ã§ã³ã§ã³ã¼ãã試ãã¨ãã«ä¾¿å©ãªå¯¾è©±åãã¼ã«ã§ãã</p> 1087<div class="code_container"> 1088<pre class="highlight"> 1089<span class="gp">$</span><span class="w"> </span>bin/rails console 1090</pre> 1091</div> 1092<p>ä¸ã®Railsã³ã³ã½ã¼ã«ã³ãã³ããå®è¡ããã¨ã以ä¸ã®ãããªããã³ããã表示ããã¾ãã</p> 1093<div class="code_container"> 1094<pre class="highlight"> 1095Loading development environment (Rails 8.1.0) 1096store(dev)> 1097</pre> 1098</div> 1099<p>ããã§å ¥åããå 容ã¯ã<code>Enter</code>ãæ¼ãã¨å®è¡ããã¾ãã 1100ããã§ã¯Railsãã¼ã¸ã§ã³ãåºåãã¦ã¿ã¾ãããã</p> 1101<div class="code_container"> 1102<pre class="highlight"> 1103store(dev)> Rails.version 1104=> "8.1.0" 1105</pre> 1106</div> 1107<p>ãããã«åãã¾ããï¼</p> 1108<h3 id="active-recordã¢ãã«ã®åºç¤"><a class="anchorlink" href="#active-record%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%9F%BA%E7%A4%8E">7 Active Recordã¢ãã«ã®åºç¤</a></h3> 1109<p>Railsã®ã¢ãã«ã¸ã§ãã¬ã¼ã¿ã¼ãå®è¡ãã¦<code>Product</code>ã¢ãã«ã使ããã¨ã<code>app/models/product.rb</code>ã«ãã¡ã¤ã«ã使ããã¾ããã使ãããã¡ã¤ã«ã«ãã以ä¸ã®ã¯ã©ã¹ã¯ãActive Recordã使ã£ã¦ãã¼ã¿ãã¼ã¹ã®<code>products</code>ãã¼ãã«ã¨ããåããã¾ãã</p> 1110<div class="code_container"> 1111<pre class="highlight"> 1112<span class="c1"># app/models/product.rb</span> 1113<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 1114<span class="k">end</span> 1115</pre> 1116</div> 1117<p>ãã®<code>Product</code>ã¯ã©ã¹ã«ã³ã¼ãããªããã¨ã«é©ãããããã¾ãããRailsã¯ãã®ã¢ãã«ã®å®ç¾©ãã©ããã£ã¦ç¥ãã®ã§ããããï¼</p> 1118<p>ãã®<code>Product</code>ã¢ãã«ã使ãããã¨ãRailsã¯ãã¼ã¿ãã¼ã¹ãã¼ãã«ã§ã«ã©ã åã¨åãç §ä¼ãããããã®å±æ§ã®ã³ã¼ããèªåçã«çæãã¾ããRailsã¯ãå®åã³ã¼ããè¨è¿°ããæéãçãã¦ã代ããã«ããã¯ã°ã©ã¦ã³ãã§å¦çãã¦ãããã®ã§ãéçºè ã¯ã¢ããªã±ã¼ã·ã§ã³ãã¸ãã¯ã«éä¸ã§ãã¾ãã</p> 1119<p>ãã®<code>Product</code>ã¢ãã«ã§ã©ããªã«ã©ã ãæ¤åºããããããRailsã³ã³ã½ã¼ã«ã§ç¢ºèªãã¾ãããã</p> 1120<p>Railsã³ã³ã½ã¼ã«ã§ä»¥ä¸ã®ã³ãã³ããå®è¡ãã¾ãã</p> 1121<div class="code_container"> 1122<pre class="highlight"> 1123store(dev)> Product.column_names 1124</pre> 1125</div> 1126<p>ããã¨ã以ä¸ã®ããã«è¡¨ç¤ºãããã¯ãã§ãã</p> 1127<div class="code_container"> 1128<pre class="highlight"> 1129=> ["id", "name", "created_at", "updated_at"] 1130</pre> 1131</div> 1132<p>Railsã¯ä¸è¨ã®ã«ã©ã æ å ±ããã¼ã¿ãã¼ã¹ã«è¦æ±ãããã®æ å ±ãç¨ãã¦<code>Product</code>ã¯ã©ã¹ã®å±æ§ãåçã«å®ç¾©ããã®ã§ãéçºè ãåå¥ã®å±æ§ãæåã§å®ç¾©ããå¿ è¦ã¯ããã¾ãããããã¯ãRailsã使ããã¨ã§éçºãããã«ç°¡åã«ãªããã示ãä¸ä¾ã§ãã</p> 1133<h4 id="ã¬ã³ã¼ãã使ãã"><a class="anchorlink" href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">7.1 ã¬ã³ã¼ãã使ãã</a></h4> 1134<p>Railsã³ã³ã½ã¼ã«ã§ä»¥ä¸ã®ã³ã¼ããå®è¡ããã¨ã<code>Product</code>ã¢ãã«ã®æ°ããã¬ã³ã¼ãã使ã§ãã¾ãã</p> 1135<div class="code_container"> 1136<pre class="highlight"> 1137store(dev)> product = Product.new(name: "T-Shirt") 1138=> #<Product:0x000000012e616c30 id: nil, name: "T-Shirt", created_at: nil, updated_at: nil> 1139</pre> 1140</div> 1141<p>ãã®<code>product</code>夿°ã¯ã<code>Product</code>ã¢ãã«ã®ã¤ã³ã¹ã¿ã³ã¹ã§ãããã®æç¹ã§ã¯ã¾ã ãã¼ã¿ãã¼ã¹ã«ä¿åãã
1141ã¦ããªãããã<code>id</code>ã<code>created_at</code>ã¨<code>updated_at</code>ã®ã¿ã¤ã ã¹ã¿ã³ãã¯ããã¾ããã</p> 1142<p>ã¬ã³ã¼ãããã¼ã¿ãã¼ã¹ã«ä¿åããã«ã¯ã<code>save</code>ãå¼ã³åºãã¾ãã</p> 1143<div class="code_container"> 1144<pre class="highlight"> 1145store(dev)> product.save 1146 TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Store'*/ 1147 Product Create (0.9ms) INSERT INTO "products" ("name", "created_at", "updated_at") VALUES ('T-Shirt', '2024-11-09 16:35:01.117836', '2024-11-09 16:35:01.117836') RETURNING "id" /*application='Store'*/ 1148 TRANSACTION (0.9ms) COMMIT TRANSACTION /*application='Store'*/ 1149=> true 1150</pre> 1151</div> 1152<p><code>save</code>ãå¼ã³åºãããã¨ãRailsã¯ã¡ã¢ãªä¸ã«ãã屿§ãåå¾ããSQLã®<code>INSERT</code>ã¯ã¨ãªãçæãã¦ãã®ã¬ã³ã¼ãããã¼ã¿ãã¼ã¹ã«æ¿å ¥ãã¾ãã</p> 1153<p>ãã®ã¨ãããã¼ã¿ãã¼ã¹ã¬ã³ã¼ãã®<code>id</code>ã¨ã<code>created_at</code>ã¿ã¤ã ã¹ã¿ã³ãããã³<code>updated_at</code>ã¿ã¤ã ã¹ã¿ã³ããç¨ãã¦ãã¡ã¢ãªä¸ã®ãªãã¸ã§ã¯ããæ´æ°ãã¾ãã<code>product</code>夿°ã®å 容ã表示ãã¦ã¿ãã°ããã®ãã¨ã確èªã§ãã¾ãã</p> 1154<div class="code_container"> 1155<pre class="highlight"> 1156store(dev)> product 1157=> #<Product:0x00000001221f6260 id: 1, name: "T-Shirt", created_at: "2024-11-09 16:35:01.117836000 +0000", updated_at: "2024-11-09 16:35:01.117836000 +0000"> 1158</pre> 1159</div> 1160<p><code>create</code>ã使ãã°ã1åã®å¼ã³åºãã§Active Recordãªãã¸ã§ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹åã¨ä¿åãåæã«å®è¡ã§ãã¾ãã</p> 1161<div class="code_container"> 1162<pre class="highlight"> 1163store(dev)> Product.create(name: "Pants") 1164 TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Store'*/ 1165 Product Create (0.4ms) INSERT INTO "products" ("name", "created_at", "updated_at") VALUES ('Pants', '2024-11-09 16:36:01.856751', '2024-11-09 16:36:01.856751') RETURNING "id" /*application='Store'*/ 1166 TRANSACTION (0.1ms) COMMIT TRANSACTION /*application='Store'*/ 1167=> #<Product:0x0000000120485c80 id: 2, name: "Pants", created_at: "2024-11-09 16:36:01.856751000 +0000", updated_at: "2024-11-09 16:36:01.856751000 +0000"> 1168</pre> 1169</div> 1170<h4 id="ã¬ã³ã¼ããã¯ã¨ãªã§åãåºã"><a class="anchorlink" href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%A7%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99">7.2 ã¬ã³ã¼ããã¯ã¨ãªã§åãåºã</a></h4> 1171<p>Active Recordã¢ãã«ã使ã£ã¦ããã¼ã¿ãã¼ã¹å ã®ã¬ã³ã¼ããæ¤ç´¢ãããã¨ãå¯è½ã§ãã</p> 1172<p>ãã¼ã¿ãã¼ã¹å ã«ãã<code>Product</code>ã®å ¨ã¬ã³ã¼ããæ¤ç´¢ããã«ã¯ã<code>all</code>ã¡ã½ããã使ãã¾ãã 1173ããã¯<strong>ã¯ã©ã¹ã¡ã½ãã</strong>ãªã®ã§ã以ä¸ã®ããã«<code>Product</code>ã¯ã©ã¹ã§ç´æ¥å¼ã³åºãã¾ãï¼ä¸è¨ã®<code>save</code>ãªã©ã<code>Product</code>ã®ã¤ã³ã¹ã¿ã³ã¹ã§å¼ã³åºãã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã¨ã¯ç°ãªãã¾ãï¼ã</p> 1174<div class="code_container"> 1175<pre class="highlight"> 1176store(dev)> Product.all 1177 Product Load (0.1ms) SELECT "products".* FROM "products" /* loading for pp */ LIMIT 11 /*application='Store'*/ 1178=> [#<Product:0x0000000121845158 id: 1, name: "T-Shirt", created_at: "2024-11-09 16:35:01.117836000 +0000", updated_at: "2024-11-09 16:35:01.117836000 +0000">, 1179 #<Product:0x0000000121845018 id: 2, name: "Pants", created_at: "2024-11-09 16:36:01.856751000 +0000", updated_at: "2024-11-09 16:36:01.856751000 +0000">] 1180</pre> 1181</div> 1182<p>ããã«ãã<code>SELECT</code> SQLã¯ã¨ãªãçæããã<code>products</code>ãã¼ãã«ãããã¹ã¦ã®ã¬ã³ã¼ããèªã¿è¾¼ã¾ãã¾ããåã¬ã³ã¼ãã¯èªåçã«Active Recordã®<code>Product</code>ã¢ãã«ã®ã¤ã³ã¹ã¿ã³ã¹ã«å¤æããããããRubyããæè»½ã«æä½ã§ãã¾ãã</p> 1183<div class="info"><p><code>all</code>ã¡ã½ãããè¿ã<code>ActiveRecord::Relation</code>ãªãã¸ã§ã¯ãã¯ãé åã«ä¼¼ããã¼ã¿ãã¼ã¹ã¬ã³ã¼ãã®ã³ã¬ã¯ã·ã§ã³ã§ããã£ã«ã¿ãªã³ã°ãä¸¦ã¹æ¿ããªã©ã®ãã¼ã¿ãã¼ã¹æä½ãå®è¡ããæ©è½ãåãã¦ãã¾ãã</p></div> 1184<h4 id="ã¬ã³ã¼ãã®ãã£ã«ã¿ãªã³ã°ã¨ä¸¦ã¹æ¿ã"><a class="anchorlink" href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88">7.3 ã¬ã³ã¼ãã®ãã£ã«ã¿ãªã³ã°ã¨ä¸¦ã¹æ¿ã</a></h4> 1185<p>ãã¼ã¿ãã¼ã¹ããåãåã£ãçµæããã£ã«ã¿ã§çµãè¾¼ã¿ããå ´åã¯ã以ä¸ã®ããã«<code>where</code>ã¡ã½ããã§ã«ã©ã ãã¨ã«ã¬ã³ã¼ãããã£ã«ã¿ãªã³ã°ã§ãã¾ãã</p> 1186<div class="code_container"> 1187<pre class="highlight"> 1188store(dev)> Product.where(name: "Pants") 1189 Product Load (1.5ms) SELECT "products".* FROM "products" WHERE "products"."name" = 'Pants' /* loading for pp */ LIMIT 11 /*application='Store'*/ 1190=> [#<Product:0x000000012184d858 id: 2, name: "Pants", created_at: "2024-11-09 16:36:01.856751000 +0000", updated_at: "2024-11-09 16:36:01.856751000 +0000">] 1191</pre> 1192</div> 1193<p>ããã«ãããçæããã<code>SELECT</code> SQLã¯ã¨ãªã«<code>WHERE</code>å¥ã追å ããã<code>"Pants"</code>ã«ããããã<code>name</code>ãæã¤ã¬ã³ã¼ãããã£ã«ã¿ã§çµãè¾¼ã¾ãã¾ããåãååãæã¤ã¬ã³ã¼ããè¤æ°è¿ãããå¯è½æ§ããããããããã§ã<code>ActiveRecord::Relation</code>ãè¿ããã¾ãã</p> 1194<p><code>order(name: :asc)</code>ã¡ã½ããã使ãã¨ãã¬ã³ã¼ãã以ä¸ã®ããã«ã¢ã«ãã¡ãããæé ã§ä¸¦ã¹æ¿ãããã¾ãã</p> 1195<div class="code_container"> 1196<pre class="highlight"> 1197store(dev)> Product.order(name: :asc) 1198 Product Load (0.3ms) SELECT "products".* FROM "products" /* loading for pp */ ORDER BY "products"."name" ASC LIMIT 11 /*application='Store'*/ 1199=> [#<Product:0x0000000120e02a88 id: 2, name: "Pants", created_at: "2024-11-09 16:36:01.856751000 +0000", updated_at: "2024-11-09 16:36:01.856751000 +0000">, 1200 #<Product:0x0000000120e02948 id: 1, name: "T-Shirt", created_at: "2024-11-09 16:35:01.117836000 +0000", updated_at: "2024-11-09 16:35:01.117836000 +0000">] 1201</pre> 1202</div> 1203<h4 id="ã¬ã³ã¼ããæ¤ç´¢ãã"><a class="anchorlink" href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B">7.4 ã¬ã³ã¼ããæ¤ç´¢ãã</a></h4> 1204<p>
1204ç¹å®ã®ã¬ã³ã¼ãã1ä»¶æ¤ç´¢ãããå ´åã¯ã©ãããã°ããã§ããããï¼</p> 1205<p>ãããè¡ãã«ã¯ã<code>find</code>ã¯ã©ã¹ã¡ã½ããã§IDãæå®ããå½¢ã§ã1ä»¶ã®ã¬ã³ã¼ããæ¤ç´¢ãã¾ãã以ä¸ã®ã³ã¼ãã¯ã<code>find</code>ã¡ã½ããã«ID<code>1</code>ãæå®ãã¦å¼ã³åºãã¦ãã¾ãã</p> 1206<div class="code_container"> 1207<pre class="highlight"> 1208store(dev)> Product.find(1) 1209 Product Load (0.2ms) SELECT "products".* FROM "products" WHERE "products"."id" = 1 LIMIT 1 /*application='Store'*/ 1210=> #<Product:0x000000012054af08 id: 1, name: "T-Shirt", created_at: "2024-11-09 16:35:01.117836000 +0000", updated_at: "2024-11-09 16:35:01.117836000 +0000"> 1211</pre> 1212</div> 1213<p>ããã«ããã<code>SELECT</code>ã¯ã¨ãªãçæããã¾ãããæ¸¡ãããID <code>1</code>ã«ããããã<code>id</code>ã«ã©ã ã<code>WHERE</code>ã§æå®ãã¦ãã¾ããã¾ããè¿ãã¬ã³ã¼ãã1ä»¶ã®ã¿ã«çµãããã<code>LIMIT 1</code>ã追å ããã¦ãã¾ãã</p> 1214<p>ããã§ã¯ããã¼ã¿ãã¼ã¹ããã¬ã³ã¼ãã1ä»¶ã ãåå¾ãããã®ã§ã<code>ActiveRecord::Relation</code>ã§ã¯ãªã<code>Product</code>ã¢ãã«ã®ã¤ã³ã¹ã¿ã³ã¹ãåå¾ãã¾ãã</p> 1215<h4 id="ã¬ã³ã¼ããæ´æ°ãã"><a class="anchorlink" href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B">7.5 ã¬ã³ã¼ããæ´æ°ãã</a></h4> 1216<p>ã¬ã³ã¼ããæ´æ°ããã«ã¯ãã<code>update</code>ã使ããã屿§ãå²ãå½ã¦ã¦ãã<code>save</code>ãå¼ã³åºããã¨ãã2ã¤ã®æ¹æ³ã使ãã¾ãã</p> 1217<p><code>Product</code>ã¢ãã«ã®ã¤ã³ã¹ã¿ã³ã¹ã§<code>update</code>ãå¼ã³åºããæ°ãã屿§ã®ããã·ã¥ã渡ãã¦ãã¼ã¿ãã¼ã¹ã«ä¿åã§ãã¾ããããã«ãããã屿§ã®å²ãå½ã¦ããããªãã¼ã·ã§ã³ã®å®è¡ãã夿´ã®ãã¼ã¿ãã¼ã¹ã¸ã®ä¿åãã1åã®ã¡ã½ããå¼ã³åºãã§ã¾ã¨ãã¦å®è¡ã§ãã¾ãã</p> 1218<div class="code_container"> 1219<pre class="highlight"> 1220store(dev)> product = Product.find(1) 1221store(dev)> product.update(name: "Shoes") 1222 TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Store'*/ 1223 Product Update (0.3ms) UPDATE "products" SET "name" = 'Shoes', "updated_at" = '2024-11-09 22:38:19.638912' WHERE "products"."id" = 1 /*application='Store'*/ 1224 TRANSACTION (0.4ms) COMMIT TRANSACTION /*application='Store'*/ 1225=> true 1226</pre> 1227</div> 1228<p>ããã«ããããã¼ã¿ãã¼ã¹å ã®è£½ååã<code>"T-Shirt"</code>ãã<code>"Shoes"</code>ã«æ´æ°ããã¾ãã 1229<code>Product.all</code>ãå度å®è¡ãã¦ããã確èªãã¦ã¿ã¾ãããã</p> 1230<div class="code_container"> 1231<pre class="highlight"> 1232store(dev)> Product.all 1233</pre> 1234</div> 1235<p>製ååã¯Shoesã¨Pantsã®2ã¤ã«ãªã£ã¦ãããã¨ããããã¾ãã</p> 1236<div class="code_container"> 1237<pre class="highlight"> 1238 Product Load (0.3ms) SELECT "products".* FROM "products" /* loading for pp */ LIMIT 11 /*application='Store'*/ 1239=> 1240[#<Product:0x000000012c0f7300 1241 id: 1, 1242 name: "Shoes", 1243 created_at: "2024-12-02 20:29:56.303546000 +0000", 1244 updated_at: "2024-12-02 20:30:14.127456000 +0000">, 1245 #<Product:0x000000012c0f71c0 1246 id: 2, 1247 name: "Pants", 1248 created_at: "2024-12-02 20:30:02.997261000 +0000", 1249 updated_at: "2024-12-02 20:30:02.997261000 +0000">] 1250</pre> 1251</div> 1252<p>2çªç®ã®æ¹æ³ã¨ãã¦ã屿§ãå²ãå½ã¦ã夿´ãããªãã¼ã·ã§ã³ãã¦ãã¼ã¿ãã¼ã¹ã«ä¿åããæºåãçµãã¦ããã<code>save</code>ãå¼ã³åºãæ¹æ³ã使ãã¾ãã</p> 1253<p>ä»åº¦ã¯ã<code>"Shoes"</code>ã¨ãã製ååã<code>"T-Shirt"</code>ã«æ»ãã¦ã¿ã¾ãããã</p> 1254<div class="code_container"> 1255<pre class="highlight"> 1256store(dev)> product = Product.find(1) 1257store(dev)> product.name = "T-Shirt" 1258=> "T-Shirt" 1259store(dev)> product.save 1260 TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Store'*/ 1261 Product Update (0.2ms) UPDATE "products" SET "name" = 'T-Shirt', "updated_at" = '2024-11-09 22:39:09.693548' WHERE "products"."id" = 1 /*application='Store'*/ 1262 TRANSACTION (0.0ms) COMMIT TRANSACTION /*application='Store'*/ 1263=> true 1264</pre> 1265</div> 1266<h4 id="ã¬ã³ã¼ããåé¤ãã"><a class="anchorlink" href="#%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">7.6 ã¬ã³ã¼ããåé¤ãã</a></h4> 1267<p>ãã¼ã¿ãã¼ã¹ããã¬ã³ã¼ããåé¤ããã«ã¯ã<code>destroy</code>ã¡ã½ããã使ãã¾ãã</p> 1268<div class="code_container"> 1269<pre class="highlight"> 1270store(dev)> product.destroy 1271 TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Store'*/ 1272 Product Destroy (0.4ms) DELETE FROM "products" WHERE "products"."id" = 1 /*application='Store'*/ 1273 TRANSACTION (0.1ms) COMMIT TRANSACTION /*application='Store'*/ 1274=> #<Product:0x0000000125813d48 id: 1, name: "T-Shirt", created_at: "2024-11-09 22:39:38.498730000 +0000", updated_at: "2024-11-09 22:39:38.498730000 +0000"> 1275</pre> 1276</div> 1277<p>ããã«ããããã¼ã¿ãã¼ã¹ãã<code>"T-Shirt"</code>製åãåé¤ããã¾ããã<code>Product.all</code>ã§ããã確èªããã¨ããã³ãã®ã¿ãè¿ããããã¨ãåããã¾ãã</p> 1278<div class="code_container"> 1279<pre class="highlight"> 1280store(dev)> Product.all 1281 Product Load (1.9ms) SELECT "products".* FROM "products" /* loading for pp */ LIMIT 11 /*application='Store'*/ 1282=> 1283[#<Product:0x000000012abde4c8 1284 id: 2, 1285 name: "Pants", 1286 created_at: "2024-11-09 22:33:19.638912000 +0000", 1287 updated_at: "2024-11-09 22:33:19.638912000 +0000">] 1288</pre> 1289</div> 1290<h4 id="ããªãã¼ã·ã§ã³"><a class="anchorlink" href="#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">7.7 ããªãã¼ã·ã§ã³</a></h4> 1291<p>Active Recordã¯ããã¼ã¿ãã¼ã¹ã«æ¿å ¥ãããã¼ã¿ãç¹å®ã®ã«ã¼ã«ã«æºæ ãã¦ãããã¨ãä¿è¨¼ããããã®<strong>ããªãã¼ã·ã§ã³</strong>ï¼validation: æ¤è¨¼ï¼æ©è½ãæä¾ãã¦ãã¾ãã</p> 1292<p>ãã¹ã¦ã®è£½åã«<code>name</code>ã«ã©ã ãåå¨ãããã¨ãä¿è¨¼ããããã«ã<code>Product</code>ã¢ãã«ã«<code>presence</code>ããªãã¼ã·ã§ã³ã追å ãã¦ã¿ã¾ãããã</p> 1293<div class="code_container"> 1294<pre class="highlight"> 1295<span class="c1"># app/models/product.rb</span> 1296<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 1297 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">
1297presence: </span><span class="kp">true</span> 1298<span class="k">end</span> 1299</pre> 1300</div> 1301<p>Railsã¯éçºä¸ã«ã³ã¼ãã®å¤æ´ãèªåçã«åèªã¿è¾¼ã¿ããã¨åé ã§èª¬æãããã¨ãæãåºãããããã¾ããã 1302ãã ããã³ã¼ããæ´æ°ããã¨ãã«ã³ã³ã½ã¼ã«ãå®è¡ä¸ã®å ´åã¯ãã³ã³ã½ã¼ã«ããæåã§æ´æ°ããå¿ è¦ãããã¾ããããã§ã¯ã<code>reload!</code>ãå®è¡ãã¦æ´æ°ãåæ ãã¦ã¿ã¾ãããã</p> 1303<div class="code_container"> 1304<pre class="highlight"> 1305store(dev)> reload! 1306Reloading... 1307</pre> 1308</div> 1309<p>ä»åº¦ã¯ãRailsã³ã³ã½ã¼ã«ã§ããã¨<code>name</code>ãæå®ããã«<code>Product</code>ã¤ã³ã¹ã¿ã³ã¹ã使ãã¦ã¿ã¾ãããã</p> 1310<div class="code_container"> 1311<pre class="highlight"> 1312store(dev)> product = Product.new 1313store(dev)> product.save 1314=> false 1315</pre> 1316</div> 1317<p>ä»åã¯ã<code>name</code>屿§ãæå®ããã¦ããªãããã<code>save</code>ã¯<code>false</code>ãè¿ãã¾ãã</p> 1318<p>Railsã¯ãä½æã»æ´æ°ã»ä¿åã®æä½ä¸ã«ããªãã¼ã·ã§ã³ãèªåçã«å®è¡ãã¦ãæå¹ãªå ¥åã§ãããã¨ãä¿è¨¼ãã¾ãã</p> 1319<p>ããªãã¼ã·ã§ã³ã«ãã£ã¦çæãããã¨ã©ã¼ã®ãªã¹ãã表示ããã«ã¯ã以ä¸ã®ããã«ã¤ã³ã¹ã¿ã³ã¹ã§<code>errors</code>ãå¼ã³åºãã¾ãã</p> 1320<div class="code_container"> 1321<pre class="highlight"> 1322store(dev)> product.errors 1323=> #<ActiveModel::Errors [#<ActiveModel::Error attribute=name, type=blank, options={}>]> 1324</pre> 1325</div> 1326<p>ããã¯ãåå¨ãã§ãã¯ã®ã¨ã©ã¼ã詳ããç¥ããã¦ããã<code>ActiveModel::Errors</code>ãªãã¸ã§ã¯ããè¿ãã¾ãã</p> 1327<p>ã¾ããã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«è¡¨ç¤ºã§ããããããããã¨ã©ã¼ã¡ãã»ã¼ã¸ãçæãããã¨ãå¯è½ã§ãã</p> 1328<div class="code_container"> 1329<pre class="highlight"> 1330store(dev)> product.errors.full_messages 1331=> ["Name can't be blank"] 1332</pre> 1333</div> 1334<p>次ã¯ããã®è£½åããã©ã¦ã¶ã§è¡¨ç¤ºããããã®Webã¤ã³ã¿ã¼ãã§ã¼ã¹ãæ§ç¯ãã¾ãããã</p> 1335<p>Railsã³ã³ã½ã¼ã«ã¯ã²ã¨ã¾ãããã¾ãã«ãã¾ãã<code>exit</code>ãå®è¡ãã¦ã³ã³ã½ã¼ã«ãçµäºã§ãã¾ãã</p> 1336<h3 id="railsã®ãªã¯ã¨ã¹ãã®æµã"><a class="anchorlink" href="#rails%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E6%B5%81%E3%82%8C">8 Railsã®ãªã¯ã¨ã¹ãã®æµã</a></h3> 1337<p>Railsã§ãHelloãã表示ããã«ã¯ãå°ãªãã¨ãã<strong>ã«ã¼ãã£ã³ã°</strong>ãã¨ã<strong>ã³ã³ããã¼ã©</strong>ããããã¦ã³ã³ããã¼ã©ã«ä»éããã<strong>ã¢ã¯ã·ã§ã³</strong>ãã¨ã<strong>ãã¥ã¼</strong>ãã使ããå¿ è¦ãããã¾ãã</p> 1338<ul> 1339<li>ã«ã¼ãã£ã³ã°ï¼routeï¼: åãåã£ããªã¯ã¨ã¹ãããé©åãªã³ã³ããã¼ã©ã®ã¢ã¯ã·ã§ã³ã«å¯¾å¿ä»ãã¾ãã</li> 1340<li>ã³ã³ããã¼ã©ã¢ã¯ã·ã§ã³ï¼controller actionï¼: ãªã¯ã¨ã¹ããå¦çãããã¥ã¼ã«è¡¨ç¤ºãããã¼ã¿ãæºåãã¾ãã</li> 1341<li>ãã¥ã¼ï¼viewï¼: ãã¼ã¿ã表示ããããã®ãã³ãã¬ã¼ãã§ãã</li> 1342</ul> 1343<p>ãããã¯ãå®è£ ã®è¦³ç¹ã§ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã</p> 1344<p>ã«ã¼ãã£ã³ã°ã¯Rubyã®<a href="https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%9B%BA%E6%9C%89%E8%A8%80%E8%AA%9E">DSLï¼ãã¡ã¤ã³åºæè¨èªï¼</a>ã§è¨è¿°ãããã«ã¼ã«ã§ãã 1345ã³ã³ããã¼ã©ã¯æ®éã®Rubyã¯ã©ã¹ã§ããããã®publicã¡ã½ãããã¢ã¯ã·ã§ã³ã«ãªãã¾ãã 1346ãã¥ã¼ã¯ãã³ãã¬ã¼ãã§ãããé常ã¯HTMLã¨Rubyãçµã¿åããã¦è¨è¿°ããã¾ãã</p> 1347<p>以ä¸ã¯ããç°¡åãªèª¬æã§ãããæ¬¡ã«ãããã®åã¹ãããã«ã¤ãã¦ããã«è©³ãã説æãã¾ãã</p> 1348<h3 id="ã«ã¼ãã£ã³ã°"><a class="anchorlink" href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">9 ã«ã¼ãã£ã³ã°</a></h3> 1349<p>Railsã®ã«ã¼ãã£ã³ã°ï¼routeãroutingï¼ã¯URLãæ§æããè¦ç´ ã®1ã¤ã§ãããåä¿¡ããHTTPãªã¯ã¨ã¹ããé©åãªã³ã³ããã¼ã©ã¨ã¢ã¯ã·ã§ã³ã«è»¢éãããã¨ã§ãªã¯ã¨ã¹ãã®å¦çæ¹æ³ã決å®ãã¾ãã</p> 1350<p>ã¾ããURLã¨HTTPãªã¯ã¨ã¹ãã¡ã½ããã«ã¤ãã¦ç°¡åã«å¾©ç¿ãã¾ãããã</p> 1351<h4 id="urlã®æ§æè¦ç´ "><a class="anchorlink" href="#url%E3%81%AE%E6%A7%8B%E6%88%90%E8%A6%81%E7%B4%A0">9.1 URLã®æ§æè¦ç´ </a></h4> 1352<p>URLãã©ã®ãããªè¦ç´ ããæ§æããã¦ãããã詳ããè¦ã¦ã¿ã¾ãããã</p> 1353<div class="code_container"> 1354<pre class="highlight"> 1355https://example.org/products?sale=true&sort=asc 1356</pre> 1357</div> 1358<p>ä¸ã®URLã®åè¦ç´ ã«ã¯ã以ä¸ã®ãããªååãããã¾ãã</p> 1359<ul> 1360<li> 1361<code>https</code>ã®é¨åã¯<strong>ãããã³ã«</strong>ï¼protocolï¼ã¨å¼ã°ãã¾ã</li> 1362<li> 1363<code>example.org</code>ã®é¨åã¯<strong>ãã¹ã</strong>ï¼hostï¼ã¨å¼ã°ãã¾ã</li> 1364<li> 1365<code>/products</code>ã®é¨åã¯<strong>ãã¹</strong>ï¼pathï¼ã¨å¼ã°ãã¾ã</li> 1366<li> 1367<code>?sale=true&sort=asc</code>ã®é¨åã¯<strong>ã¯ã¨ãªãã©ã¡ã¼ã¿</strong>ï¼query parametersï¼ã¨å¼ã°ãã¾ã</li> 1368</ul> 1369<h4 id="httpã¡ã½ããã¨ãã®ç®ç"><a class="anchorlink" href="#http%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84">9.2 HTTPã¡ã½ããã¨ãã®ç®ç</a></h4> 1370<p>HTTPãªã¯ã¨ã¹ãã¯ãç¹å®ã®URLã«å¯¾ãã¦ãµã¼ãã¼ãå®è¡ãã¹ãã¢ã¯ã·ã§ã³ãæç¤ºããã¨ãã«HTTPã¡ã½ããï¼HTTP verb
1370: HTTPåè©ã¨ãå¼ã°ãã¾ãï¼ãå©ç¨ãã¾ãã</p> 1371<p>æãä¸è¬çãªHTTPã¡ã½ããã¯æ¬¡ã®ã¨ããã§ãã</p> 1372<ul> 1373<li> 1374<code>GET</code>ãªã¯ã¨ã¹ã: 1375ç¹å®ã®URLã®ãã¼ã¿ãåå¾ãããããµã¼ãã¼ã«æç¤ºãã¾ãï¼ãã¼ã¸ã®èªã¿è¾¼ã¿ãã¬ã³ã¼ãã®åå¾ãªã©ï¼ã</li> 1376<li> 1377<code>POST</code>ãªã¯ã¨ã¹ã: 1378å¦çãå®è¡ããããã®ãã¼ã¿ãURLã«éä¿¡ãã¾ãï¼éå¸¸ã¯æ°ããã¬ã³ã¼ãã使ãã¾ãï¼ã</li> 1379<li> 1380<code>PUT</code>ã¾ãã¯<code>PATCH</code>ãªã¯ã¨ã¹ã: 1381æ¢åã®ã¬ã³ã¼ããæ´æ°ããããã®ãã¼ã¿ãURLã«éä¿¡ãã¾ãã</li> 1382<li> 1383<code>DELETE</code>ãªã¯ã¨ã¹ã: 1384URLã«éä¿¡ãããã¨ãã¬ã³ã¼ããåé¤ãããããµã¼ãã¼ã«æç¤ºãã¾ãã</li> 1385</ul> 1386<h4 id="railsã®ã«ã¼ãã£ã³ã°"><a class="anchorlink" href="#rails%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">9.3 Railsã®ã«ã¼ãã£ã³ã°</a></h4> 1387<p>Railsã«ãããã«ã¼ãã£ã³ã°ã¯ãHTTPã¡ã½ããã¨URLãã¹ããã¢ã«ããã³ã¼ãè¡ãæãã¾ãã 1388ã«ã¼ãã£ã³ã°ã¯ãã©ã®<code>controller</code>ã¨<code>action</code>ã§ãªã¯ã¨ã¹ãã«å¿çãã¹ãããRailsã«æç¤ºãã¾ãã</p> 1389<p>Railsã§ã«ã¼ãã£ã³ã°ãå®ç¾©ããã«ã¯ãã³ã¼ãã¨ãã£ã¿ãåã³éãã¦ã<code>config/routes.rb</code>ãã¡ã¤ã«å ã®ã«ã¼ãã£ã³ã°ã«ã以ä¸ã®<code>get</code>ã§å§ã¾ãè¡ã追å ãã¾ãã</p> 1390<div class="code_container"> 1391<pre class="highlight"> 1392<span class="c1"># config/routes.rb</span> 1393<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1394 <span class="c1"># ï¼çç¥ï¼</span> 1395 <span class="n">get</span> <span class="s2">"/products"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#index"</span> <span class="c1"># ãã®è¡ã追å </span> 1396<span class="k">end</span> 1397</pre> 1398</div> 1399<p>ãã®ã«ã¼ãã£ã³ã°ã¯ã<code>/products</code>ãã¹ã¸ã®<code>GET</code>ãªã¯ã¨ã¹ããæ¢ç´¢ããããRailsã«æç¤ºãã¾ãããã®ä¾ã§ã¯ããªã¯ã¨ã¹ãã®ã«ã¼ãã£ã³ã°å ã¨ãã¦<code>"products#index"</code>ãæå®ãã¦ãã¾ãã</p> 1400<p>ããããããªã¯ã¨ã¹ããè¦ã¤ããã¨ãRailsã¯ãã®ãªã¯ã¨ã¹ãã<code>ProductsController</code>ã¨ããã³ã³ããã¼ã©å ã®<code>index</code>ã¢ã¯ã·ã§ã³ã«éä¿¡ãã¾ããRailsã¯ãã®ããã«ãã¦ãªã¯ã¨ã¹ããå¦çãããã©ã¦ã¶ã«ã¬ã¹ãã³ã¹ãè¿ãã¾ãã</p> 1401<p>ä¸ã®ã«ã¼ãã£ã³ã°ã§ã¯ãããããã³ã«ãããã¡ã¤ã³ããã¯ã¨ãªãã©ã¡ã¼ã¿ãã®æå®ãä¸è¦ã§ãããã¨ã«æ°ä»ãã§ãããããã®çç±ã¯ããªã¯ã¨ã¹ãã¯åºæ¬çã«ãããã³ã«ã¨ãã¡ã¤ã³ã«ãã£ã¦ãµã¼ãã¼ã«ç¢ºå®ã«å±ãããã§ããRailsã¯ãªã¯ã¨ã¹ããåå¾ããã¨ãå®ç¾©æ¸ã¿ã®ã«ã¼ãã£ã³ã°ã«åºã¥ãã¦ããªã¯ã¨ã¹ãã«å¿çããããã®ãã¹ãèªèãã¾ãã</p> 1402<p>ãªããã¯ã¨ãªãã©ã¡ã¼ã¿ã¯ãRailsããªã¯ã¨ã¹ãã«é©ç¨ã§ãããªãã·ã§ã³ã®ãããªãã®ã§å¿ é ã§ã¯ãªããé常ã¯ã³ã³ããã¼ã©ã§ãã¼ã¿ããã£ã«ã¿ãªã³ã°ããã¨ãã«ä½¿ããã¾ãã</p> 1403<p><img src="/railsguides/images/getting_started/routing_light.jpg" alt="Railsã®ã«ã¼ãã£ã³ã°ã®æµã" data-src="/railsguides/images/getting_started/routing_light.jpg" class="lazyload" loading="lazy"></p> 1404<p>å¥ã®ä¾ãè¦ã¦ã¿ã¾ãããã 1405åè¿°ã®ã«ã¼ãã£ã³ã°ã®ä¸ã«ã以ä¸ã®è¡ã追å ãã¾ãã</p> 1406<div class="code_container"> 1407<pre class="highlight"> 1408<span class="c1"># config/routes.rb</span> 1409<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1410 <span class="c1"># ...</span> 1411 <span class="n">get</span> <span class="s2">"/products"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#index"</span> 1412 <span class="n">post</span> <span class="s2">
1412"/products"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#create"</span> 1413<span class="k">end</span> 1414</pre> 1415</div> 1416<p>ããã§ã¯ã<code>/products</code>ãã¹ã¸ã®<code>POST</code>ãªã¯ã¨ã¹ããåãåã£ããã<code>ProductsController</code>ã®<code>create</code>ã¢ã¯ã·ã§ã³ã§ãªã¯ã¨ã¹ããå¦çããããRailsã«æç¤ºãã¦ãã¾ãã</p> 1417<p>ã«ã¼ãã£ã³ã°ã§ã¯ãç¹å®ã®ãã¿ã¼ã³ãæã¤URLã«ããããããå¿ è¦ãçããå ´åãããã¾ãã 1418ã§ã¯ä»¥ä¸ã®ã«ã¼ãã£ã³ã°ã¯ãã©ã®ããã«æ©è½ãããããããã§ããããï¼</p> 1419<div class="code_container"> 1420<pre class="highlight"> 1421<span class="c1"># config/routes.rb</span> 1422<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1423 <span class="c1"># ...</span> 1424 <span class="n">get</span> <span class="s2">"/products/:id"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#show"</span> 1425<span class="k">end</span> 1426</pre> 1427</div> 1428<p>ãã®ã«ã¼ãã£ã³ã°ã®ãã¹ã«ã¯<code>:id</code>ãå«ã¾ãã¦ãã¾ããããã¯<strong>ãã©ã¡ã¼ã¿</strong>ï¼parameterãparamsã¨ãï¼ã¨å¼ã°ããå¾ã§ãªã¯ã¨ã¹ããå¦çããã¨ãã«ä½¿ãURLã®ä¸é¨ãããã«ãã£ããã£ããã¾ãã</p> 1429<p>ãã¨ãã°ã¦ã¼ã¶ã¼ã<code>/products/1</code>ã¨ãããã¹ã«ã¢ã¯ã»ã¹ããã¨ã<code>:id</code>ãã©ã¡ã¼ã¿ã<code>1</code>ã«è¨å®ãããã³ã³ããã¼ã©ã¢ã¯ã·ã§ã³ã§IDã1ã®è£½åã¬ã³ã¼ããæ¤ç´¢ãã¦è¡¨ç¤ºã§ããããã«ãªãã¾ãã 1430<code>/products/2</code>ã¯åæ§ã«ãIDã2ã®è£½åã表示ããã®ã«ä½¿ãã¾ãã</p> 1431<p>ã«ã¼ãã£ã³ã°ã®ãã©ã¡ã¼ã¿ã«ã¯ãæ´æ°ä»¥å¤ã®ãã®ã使ãã¾ãã</p> 1432<p>ãã¨ãã°ããã¾ãã¾ãªè¨äºãå«ãããã°ãµã¼ãã¹ã§ã¯ã以ä¸ã®ã«ã¼ãã£ã³ã°ã§<code>/blog/hello-world</code>ã¨ãããããããã«ãªãã¾ãã</p> 1433<div class="code_container"> 1434<pre class="highlight"> 1435<span class="c1"># config/routes.rb</span> 1436<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1437 <span class="c1"># ...</span> 1438 <span class="n">get</span> <span class="s2">"/blog/:title"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"blog#show"</span> 1439<span class="k">end</span> 1440</pre> 1441</div> 1442<p>ä¸ã®ã«ã¼ãã£ã³ã°ã§ã¯ã<code>/blog/hello-world</code>ãã<code>hello-world</code>ã¨ãããã©ã¡ã¼ã¿ã<code>slug</code>ã¨ãã¦ãã£ããã£ãããã®ãã©ã¡ã¼ã¿ã«ãããããã¿ã¤ãã«ã®ããã°æç¨¿ãæ¤ç´¢ã§ããããã«ãªãã¾ãã</p> 1443<h5 id="crudã®ã«ã¼ãã£ã³ã°"><a class="anchorlink" href="#crud%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">9.3.1 CRUDã®ã«ã¼ãã£ã³ã°</a></h5> 1444<p><a href="https://ja.wikipedia.org/wiki/Representational_State_Transfer#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9">ãªã½ã¼ã¹</a>ã¸ã®æä½ã§éå¸¸å¿ è¦ã¨ãªãä¸è¬çãªæä½ã¯ãã使ããèªã¿åãããæ´æ°ããåé¤ãã®4ã¤ã§ããã<a href="https://ja.wikipedia.org/wiki/CRUD">CRUD</a>ã¨å¼ã°ãã¾ãã</p> 1445<p>ããã¯ã8ã¤ã®ä¸è¬çãªã³ã³ããã¼ã©ã¢ã¯ã·ã§ã³ã«ç¸å½ãã¾ãã</p> 1446<ul> 1447<li> 1448<code>index</code>: ãã¹ã¦ã®ã¬ã³ã¼ãã表示ãã¾ã</li> 1449<li> 1450<code>new</code>: æ°ããã¬ã³ã¼ã1ä»¶ã使ããããã®ãã©ã¼ã ãã¬ã³ããªã³ã°ãã¾ã</li> 1451<li> 1452<code>create</code>: <code>new</code>ã®ãã©ã¼ã éä¿¡ãå¦çããã¨ã©ã¼ãå¦çãã¦ã¬ã³ã¼ãã1件使ãã¾ã</li> 1453<li> 1454<code>show</code>: æå®ã®ã¬ã³ã¼ã1ä»¶ãã¬ã³ããªã³ã°ãã¦è¡¨ç¤ºãã¾ã</li> 1455<li> 1456<code>edit</code>: æå®ã®ã¬ã³ã¼ã1ä»¶ãæ´æ°ããããã®ãã©ã¼ã ãã¬ã³ããªã³ã°ãã¾ã</li> 1457<li> 1458<code>update</code>ï¼ãªã½ã¼ã¹å ¨ä½ï¼: ãªã½ã¼ã¹å ¨ä½ãæ´æ°ãããã©ã¼ã éä¿¡ãå¦çãã¾ãã 1459ããã¯é常ã<code>PUT</code>ãªã¯ã¨ã¹ãã§ããªã¬ã¼ããããªã½ã¼ã¹ã®ãã¹ã¦ã®å±æ§ãç½
1459®ãæãã¾ã</li> 1460<li> 1461<code>update</code>ï¼ç¹å®ã®ãªã½ã¼ã¹ã®ã¿ï¼: ç¹å®ã®å±æ§ã®ã¿ãæ´æ°ãããã©ã¼ã éä¿¡ãå¦çãã¾ãã 1462ããã¯é常ã<code>PATCH</code>ãªã¯ã¨ã¹ãã§ããªã¬ã¼ããããªã½ã¼ã¹ãé¨åçã«æ´æ°ãã¾ã</li> 1463<li> 1464<code>destroy</code>: æå®ã®ã¬ã³ã¼ã1ä»¶ãåé¤ãã¾ã</li> 1465</ul> 1466<p>ãããã®CRUDã¢ã¯ã·ã§ã³ã®ã«ã¼ãã£ã³ã°ã¯ã以ä¸ã®ããã«æ¸ããã¨ã§è¿½å ãããã¨ãä¸å¿å¯è½ã§ãã</p> 1467<div class="code_container"> 1468<pre class="highlight"> 1469<span class="c1"># config/routes.rb</span> 1470<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1471 <span class="c1"># ...</span> 1472 <span class="n">get</span> <span class="s2">"/products"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#index"</span> 1473 1474 <span class="n">get</span> <span class="s2">"/products/new"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#new"</span> 1475 <span class="n">post</span> <span class="s2">"/products"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#create"</span> 1476 1477 <span class="n">get</span> <span class="s2">"/products/:id"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#show"</span> 1478 1479 <span class="n">get</span> <span class="s2">"/products/:id/edit"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#edit"</span> 1480 <span class="n">patch</span> <span class="s2">"/products/:id"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#update"</span> 1481 <span class="n">put</span> <span class="s2">"/products/:id"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#update"</span> 1482 1483 <span class="n">delete</span> <span class="s2">"/products/:id"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"products#destroy"</span> 1484<span class="k">end</span> 1485</pre> 1486</div> 1487<h5 id="ãªã½ã¼ã¹ã«ã¼ãã£ã³ã°"><a class="anchorlink" href="#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">9.3.2 ãªã½ã¼ã¹ã«ã¼ãã£ã³ã°</a></h5> 1488<p>ããã8ã¤ã®ã«ã¼ãã£ã³ã°ãæ¯åå ¥åããã®ã¯åé·ãªã®ã§ãRailsã§ã¯ã«ã¼ãã£ã³ã°ã1è¡ã§å®ç¾©ã§ããã·ã§ã¼ãã«ãããæä¾ãã¦ãã¾ãã</p> 1489<p>ä¸è¨ã®ã«ã¼ãã£ã³ã°ã以ä¸ã®1è¡ã«ç½®ãæãã¦ãä¸ã¨åãCRUDã¢ã¯ã·ã§ã³ããã¹ã¦ä½æã§ããããã«ãã¾ãããã</p> 1490<div class="code_container"> 1491<pre class="highlight"> 1492<span class="c1"># config/routes.rb</span> 1493<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1494 <span class="c1"># ...</span> 1495 <span class="n">resources</span> <span class="ss">:products</span> 1496<span class="k">end</span> 1497</pre> 1498</div> 1499<div class="info"><p>CRUDã¢ã¯ã·ã§ã³ã®ä¸é¨ãã使ããªãå ´åã¯ãå¿ è¦ãªã¢ã¯ã·ã§ã³ã ããæ£ç¢ºã«æå®ãã使ããªãã¢ã¯ã·ã§ã³ã¯ç¡å¹ã«ãã¦ããã¾ãããã詳ããã¯<a href="https://railsguides.jp/routing.html#%E4%BD%9C%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B">ã«ã¼ãã£ã³ã°ã¬ã¤ã</a>ãåç §ãã¦ãã ããã</p></div> 1500<h4 id="ã«ã¼ãã£ã³ã°ã³ãã³ã"><a class="anchorlink" href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">9.4 ã«ã¼ãã£ã³ã°ã³ãã³ã</a></h4> 1501<p>Railsã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ãå¿çããã«ã¼ãã£ã³ã°ããã¹ã¦è¡¨ç¤ºããã³ãã³ããç¨æããã¦ãã¾ãã</p> 1502<p>ã¿ã¼ããã«ãéãã¦ä»¥ä¸ã®ã³ãã³ããå®è¡ãã¾ãã</p> 1503<div class="code_container"> 1504<pre class="highlight"> 1505<span class="gp">$</span><span class="w"> </span>bin/rails routes 1506</pre> 1507</div> 1508<p><code>resources :products</code>ã§çæãããã«ã¼ãã£ã³ã°ã以ä¸ã®ããã«è¡¨ç¤ºããã¾ãã</p> 1509<div class="code_container"> 1510<pre class="highlight"> 1511 Prefix Verb URI Pattern Controller#Action 1512 products GET /products(.:format) products#index 1513 POST /products(.:format) products#create 1514 new_product GET /products/new(.:format) products#new 1515edit_product GET /products/:id/edit(.:format) products#edit 1516 product GET /products/:id(.:format) products#show 1517 PATCH /products/:id(.:format) products#update 1518 PUT /products/:id(.:format) products#update 1519 DELETE /products/:id(.:format) products#destroy 1520</pre> 1521</div> 1522<p>表示ãããã«ã¼ãã£ã³ã°ã«ã¯ãä¸ã®ä»ã«ããã«ã¹ãã§ãã¯ãªã©ã®ä»ã®çµã¿è¾¼ã¿ã®Railsæ©è½ã«ããã«ã¼ãã£ã³ã°ãå«ã¾ãã¦ããã®ããããã¾ãã</p> 1523<div class="info"><p>訳注: éçºä¸ã®Railsãµã¼ãã¼ã§ã¯ã<code>http://localhost:3000/rails/info/routes</code>ã«ãã©ã¦ã¶ã§ã¢ã¯ã»ã¹ãããã¨ã§ã«ã¼ãã£ã³ã°æ å ±ã表示ã§ãã¾ãã</p></div> 1524<h3 id="ã³ã³ããã¼ã©ã¨ã¢ã¯ã·ã§ã³"><a class="anchorlink" href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%A8%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3">10 ã³ã³ããã¼ã©ã¨ã¢ã¯ã·ã§ã³</a></h3> 1525<p>
1525製åã®ã«ã¼ãã£ã³ã°ãå®ç¾©ããã®ã§ã次ã¯ã³ã³ããã¼ã©ã¨ã¢ã¯ã·ã§ã³ãå®è£ ãã¦ããããã®URLã¸ã®ãªã¯ã¨ã¹ããå¦çã§ããããã«ãã¾ãããã</p> 1526<p>以ä¸ã®<code>bin/rails generate</code>ã³ãã³ãã¯ã<code>index</code>ã¢ã¯ã·ã§ã³ãå«ã<code>ProductsController</code>ãçæãã¾ããã«ã¼ãã£ã³ã°ã¯æ¢ã«è¨å®ããã®ã§ã<code>--skip-routes</code>ãã©ã°ã§ã¸ã§ãã¬ã¼ã¿ã§ã®ã«ã¼ãã£ã³ã°çæé¨åãã¹ãããã§ãã¾ãã</p> 1527<div class="code_container"> 1528<pre class="highlight"> 1529<span class="gp">$</span><span class="w"> </span>bin/rails generate controller Products index <span class="nt">--skip-routes</span> 1530<span class="go"> create app/controllers/products_controller.rb 1531 invoke erb 1532 create app/views/products 1533 create app/views/products/index.html.erb 1534 invoke test_unit 1535 create test/controllers/products_controller_test.rb 1536 invoke helper 1537 create app/helpers/products_helper.rb 1538 invoke test_unit 1539</span> 1540</pre> 1541</div> 1542<p>ãã®ã³ãã³ããå®è¡ããã¨ãã³ã³ããã¼ã©ç¨ã«ä»¥ä¸ã®ãã¾ãã¾ãªãã¡ã¤ã«ãçæããã¾ãã</p> 1543<ul> 1544<li>ã³ã³ããã¼ã©ãã¡ã¤ã«èªèº«ï¼<code>products_controller.rb</code>ï¼</li> 1545<li>çæããã³ã³ããã¼ã©ã§å©ç¨ãããã¥ã¼ãä¿åãããã©ã«ãï¼<code>app/views/products/</code>ï¼</li> 1546<li>ã³ã³ããã¼ã©çææã«æå®ããã¢ã¯ã·ã§ã³ã«å¯¾å¿ãããã¥ã¼ãã¡ã¤ã«ï¼<code>index.html.erb</code>ï¼</li> 1547<li>ãã®ã³ã³ããã¼ã©ç¨ã®ãã¹ããã¡ã¤ã«ï¼<code>products_controller_test.rb</code>ï¼</li> 1548<li>ãã¥ã¼ã®ãã¸ãã¯ãåãåºãã¦é ç½®ããããã®ãã«ãã¼ãã¡ã¤ã«ï¼<code>products_helper.rb</code>ï¼</li> 1549</ul> 1550<p><code>app/controllers/products_controller.rb</code>ã§å®ç¾©ããã¦ãã<code>ProductsController</code>ãã¨ãã£ã¿ã§éãã¨ã以ä¸ã®ãããªæãã«ãªã£ã¦ããã¯ãã§ãã</p> 1551<div class="code_container"> 1552<pre class="highlight"> 1553<span class="c1"># app/controllers/products_controller.rb</span> 1554<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1555 <span class="k">def</span> <span class="nf">index</span> 1556 <span class="k">end</span> 1557<span class="k">end</span> 1558</pre> 1559</div> 1560<div class="note"><p><code>products_controller.rb</code>ã¨ãããã¡ã¤ã«åã¯ããã®ãã¡ã¤ã«ã§å®ç¾©ããã¦ãã<code>ProductsController</code>ã¨ããã¯ã©ã¹åãå°æåã«å¤ãã¦ã¢ã³ãã¼ã¹ã³ã¢åºåãã«å¤æ´ãããã®ã§ãããã¨ã«æ°ä»ãããããã¾ããããã®å½åãã¿ã¼ã³ãå®ããã¨ã§ãä»ã®è¨èªã§è¦ããããããª<code>require</code>ã使ããªãã¦ããRailsãã³ã¼ããèªåçã«èªã¿è¾¼ããããã«ãªãã¾ãã</p></div> 1561<p>ããã§ã®<code>index</code>ã¡ã½ããã¯ã¢ã¯ã·ã§ã³ã§ããã¡ã½ããã®ä¸èº«ã¯ç©ºã§ãããã¡ã½ããã空ã®å ´åã¯ãããã©ã«ãã§ã¢ã¯ã·ã§ã³åã¨ä¸è´ããååã®ãã³ãã¬ã¼ããã¬ã³ããªã³ã°ããããã«ãªã£ã¦ããã®ã§åé¡ããã¾ããã</p> 1562<p><code>index</code>ã¢ã¯ã·ã§ã³ãå®è¡ããã¨ã<code>app/views/products/index.html.erb</code>ãã¬ã³ããªã³ã°ãã¾ãããã®ãã¡ã¤ã«ãã³ã¼ãã¨ãã£ã¿ã§éãã¨ãã¬ã³ããªã³ã°ãããHTMLã以ä¸ã®ããã«è¡¨ç¤ºããã¾ãã</p> 1563<div class="code_container"> 1564<pre class="highlight"> 1565<span class="c"><%# app/views/products/index.html.erb %></span> 1566<span class="nt"><h1></span>Products#index<span class="nt"></h1></span> 1567<span class="nt"><p></span>Find me in app/views/products/index.html.erb<span class="nt"></p></span> 1568</pre> 1569</div> 1570<h4 id="ãªã¯ã¨ã¹ãã使ãã"><a class="anchorlink" href="#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">10.1 ãªã¯ã¨ã¹ãã使ãã</a></h4> 1571<p>使ããçµæããã©ã¦ã¶ã§ç¢ºèªãã¦ã¿ã¾ãããã</p> 1572<p>ã¾ããã¿ã¼ããã«ã§<code>bin/rails server</code>ãå®è¡ãã¦Railsãµã¼ãã¼ãèµ·åãã¾ãã 1573次ã«ããã©ã¦ã¶ã§<code>http://localhost:3000</code>ãéãã¨ãRailsã®ã¦ã§ã«ã«ã ãã¼ã¸ã表示ããã¾ãã</p> 1574<p>ãã©ã¦ã¶ã§<code>http://localhost:3000/products</code>ãéãã¨ãRailsã¯è£½åã®<code>index</code>ãã¼ã¸ã®HTMLãã¬ã³ããªã³ã°ãã¾ãã</p> 1575<p>ãã®ã¨ãã®å¦çã®æµãã¯ä»¥ä¸ã®ããã«ãªãã¾ãã</p> 1576<ol> 1577<li>ãã©ã¦ã¶ã<code>/products</code>ãã¹ã¸ã®ãªã¯ã¨ã¹ããéä¿¡ããã¨ãã«ã¼ãã£ã³ã°ã¯<code>products#index</code>ã«ããããã¾ãã</li> 1578<li>次ã«Railsã¯ããã®ãªã¯ã¨ã¹ãã<code>ProductsController</code>ã«éä¿¡ãã¦<code>index</code>ã¢ã¯ã·ã§ã³ãå¼ã³åºãã¾ãã</li> 1579<li> 1580<code>index</code>ã¢ã¯ã·ã§ã³ã¯ç©ºãªã®ã§ãRailsã¯ãã®ã³ã³ããã¼ã©ã¢ã¯ã·ã§ã³ã«ä¸è´ãã<code>app/views/products/index.html.erb</code>ãã³ãã¬ã¼ããã¬ã³ããªã³ã°ãã¦ããã©ã¦ã¶ã«ã¬ã¹ãã³ã¹ãè¿ãã¾ãã</li> 1581</ol> 1582<p>ãªãã<code>config/routes.rb</code>ãã¡ã¤ã«ã«ä»¥ä¸ã®è¡ã追å ããã¨ãrootãã¹ã«ã¢ã¯ã»ã¹ããã¨ãã®ã«ã¼ãã£ã³ã°ã§<code>Products</code>ã®<code>index</code>ã¢ã¯ã·ã§ã³ãã¬ã³ããªã³ã°ããããã«Railsã«æç¤ºã§ãã¾ãã</p> 1583<div class="code_container"> 1584<pre class="highlight"> 1585<span class="c1"># config/routes.rb</span> 1586<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 1587 <span class="c1"># ...</span> 1588 <span class="n">root</span> <span class="s2">"products#index"</span> 1589 <span class="n">resources</span> <span class="ss">:products</span> 1590<span class="k">end</span> 1591</pre> 1592</div> 1593<p>ããã§ã<code>http://localhost:3000</code>ã«ã¢ã¯ã»ã¹ããã¨ãRailsã<code>Products#index</code>ãã¬ã³ããªã³ã°ããããã«ãªãã¾ãã</p> 1594<h4 id="ã¤ã³ã¹ã¿ã³ã¹å¤æ°"><a class="anchorlink" href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%A4%89%E6%95%B0">10.2 ã¤ã³ã¹ã¿ã³ã¹å¤æ°</a></h4> 1595<p>ããã«å ã«é²ãã§ããã¼ã¿ãã¼ã¹ã«ããã¬ã³ã¼ããããã¤ãã¬ã³ããªã³ã°ãã¦ã¿ã¾ãããã</p> 1596<p><code>index</code>ã¢ã¯ã·ã§ã³ãæ´æ°ãã¦ä»¥ä¸ã®ããã«ãã¼ã¿ãã¼ã¹ã¯ã¨ãªã追å ãããããã¤ã³ã¹ã¿ã³ã¹å¤æ°ã«å²ãå½ã¦ã¦ã¿ã¾ããããRailsã®ã³ã³ããã¼ã©ã§ã¯ããã¥ã¼ã«ãã¼ã¿ã渡ãã¨ãã«ã¤ã
1596³ã¹ã¿ã³ã¹å¤æ°ï¼<code>@</code>ã§å§ã¾ã夿°ï¼ã使ããã¾ãã</p> 1597<div class="code_container"> 1598<pre class="highlight"> 1599<span class="c1"># app/controllers/products_controller.rb</span> 1600<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1601 <span class="k">def</span> <span class="nf">index</span> 1602 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 1603 <span class="k">end</span> 1604<span class="k">end</span> 1605</pre> 1606</div> 1607<p>次ã«ã<code>app/views/products/index.html.erb</code>ã®ãã¥ã¼ãã³ãã¬ã¼ããã¡ã¤ã«å ã«ããHTMLã以ä¸ã®ERBã³ã¼ãã«ç½®ãæãã¾ãã</p> 1608<div class="code_container"> 1609<pre class="highlight"> 1610<span class="c"><%# app/views/products/index.html.erb %></span> 1611<span class="cp"><%=</span> <span class="n">debug</span> <span class="vi">@products</span> <span class="cp">%></span> 1612</pre> 1613</div> 1614<p><a href="https://docs.ruby-lang.org/ja/latest/class/ERB.html">ERB</a>ã¯Embedded Rubyã®ç¥ã§ãRubyã³ã¼ããå®è¡ãã¦Railsã§HTMLãåçã«çæã§ããããã«ãã¾ãã</p> 1615<p><code><%= %></code>ã¿ã°ã¯ããã®å å´ã«æ¸ããRubyã³ã¼ããå®è¡ãã¦æ»ãå¤ããã©ã¦ã¶ã§åºåããããERBã«æç¤ºãã¾ãããã®å ´åãåãåã£ã<code>@products</code>ã<code>debug</code>ã§YAMLã«å¤æãããYAMLãåºåããã¾ãã</p> 1616<p>ãã©ã¦ã¶ã§<code>http://localhost:3000/</code>
1616ãæ´æ°ããã¨ãåºåçµæã夿´ããããã¨ããããã¾ãã表示ããã¦ããã®ã¯ããã¼ã¿ãã¼ã¹å ã®ã¬ã³ã¼ããYAMLå½¢å¼ã«å¤æããããã®ã§ãã</p> 1617<p><code>debug</code>ãã«ãã¼ã¯ããããã°ã§å½¹ç«ã¤ããã«å¤æ°ãYAMLå½¢å¼ã§åºåãã¾ãã 1618ãã¨ãã°ãã³ã³ããã¼ã©ã§è¤æ°å½¢ã®<code>@products</code>ã®ã¤ããã§ãã£ããåæ°å½¢ã®<code>@product</code>ãæ¸ãã¦ãã¾ã£ãå ´åã夿°ãã³ã³ããã¼ã©ã§æ£ããè¨å®ããã¦ããªããã¨ãçªãæ¢ããã®ã«å½¹ç«ã¡ã¾ãã</p> 1619<div class="info"><p>ãã®ä»ã«å©ç¨å¯è½ãªãã«ãã¼ã«ã¤ãã¦è©³ããã¯<a href="action_view_helpers.html">Action Viewãã«ãã¼ã¬ã¤ã</a>ãåç §ãã¦ãã ããã</p></div> 1620<p>次ã¯ããã¥ã¼ã«ãã¹ã¦ã®è£½ååããªã¹ã表示ãããããã«ãã¦ã¿ã¾ãããã 1621<code>app/views/products/index.html.erb</code>ã以ä¸ã®ããã«æ´æ°ãã¾ãã</p> 1622<div class="code_container"> 1623<pre class="highlight"> 1624<span class="c"><%# app/views/products/index.html.erb %></span> 1625<span class="nt"><h1></span>Products<span class="nt"></h1></span> 1626 1627<span class="nt"><div</span> <span class="na">id=</span><span class="s">"products"</span><span class="nt">></span> 1628 <span class="cp"><%</span> <span class="vi">@products</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">product</span><span class="o">|</span> <span class="cp">%></span> 1629 <span class="nt"><div></span> 1630 <span class="cp"><%=</span> <span class="n">product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span> 1631 <span class="nt"></div></span> 1632 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1633<span class="nt"></div></span> 1634</pre> 1635</div> 1636<p>ERBå ã®ã³ã¼ãã¯ã<code>ActiveRecord::Relation</code>ãªãã¸ã§ã¯ãã§ãã<code>@products</code>å ã®å製åãã«ã¼ããã製ååãå«ã<code><div></code>ã¿ã°ãã¬ã³ããªã³ã°ãã¾ãã</p> 1637<p>ããã§ãæ°ããERBã¿ã°ã使ããã¦ãã¾ãã 1638<code><% %></code>ã®ä¸ã«æ¸ããRubyã³ã¼ãã¯å®è¡æã«è©ä¾¡ããã¾ãããæ»ãå¤ããã©ã¦ã¶ã«åºåããªãç¹ã<code><%= %></code>ã¨ç°ãªãã¾ããããã«ããããã®ã¾ã¾ã ã¨HTMLã«ä¸è¦ãªé åãåºåãã<code>@products.each</code>ã®åºåãç¡è¦ãããããã«ãªãã¾ãã</p> 1639<h4 id="crudã¢ã¯ã·ã§ã³"><a class="anchorlink" href="#crud%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3">10.3 CRUDã¢ã¯ã·ã§ã³</a></h4> 1640<p>次ã¯ãåå¥ã®è£½åã1ä»¶ãã¤è¡¨ç¤ºã§ããããã«ããå¿ è¦ãããã¾ããããã¯ããªã½ã¼ã¹ãèªã¿åãããã®CRUDã®Rï¼Readï¼ã«ç¸å½ãã¾ãã</p> 1641<p>製åã¸ã®ã«ã¼ãã£ã³ã°ã¯ãæ¢ã«<code>resources :products</code>ã«ã¼ãã£ã³ã°ã§ã¾ã¨ãã¦å®ç¾©ãã¦ããã®ã§ã<code>products#show</code>ãæãã«ã¼ãã£ã³ã°ã¨ãã¦<code>/products/:id</code> ãçæãããããã«ãªã£ã¦ãã¾ãã</p> 1642<p>次ã«ãããã«å¯¾å¿ãã<code>show</code>ã¢ã¯ã·ã§ã³ã<code>ProductsController</code>ã«è¿½å ãã¦ãå¼ã³åºãããã¨ãã®æ¯ãèããå®ç¾©ããå¿ è¦ãããã¾ãã</p> 1643<h4 id="åå¥ã®è£½åã表示ãã"><a class="anchorlink" href="#%E5%80%8B%E5%88%A5%E3%81%AE%E8%A3%BD%E5%93%81%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B">10.4 åå¥ã®è£½åã表示ãã</a></h4> 1644<p><code>ProductsController</code>ãã¨ãã£ã¿ã§éãã¦ã以ä¸ã®ããã«<code>show</code>ã¢ã¯ã·ã§ã³ã追å ãã¾ãã</p> 1645<div class="code_container"> 1646<pre class="highlight"> 1647<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1648 <span class="k">def</span> <span class="nf">index</span> 1649 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 1650 <span class="k">end</span> 1651 1652 <span class="k">def</span> <span class="nf">show</span> 1653 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 1654 <span class="k">end</span> 1655<span class="k">end</span> 1656</pre> 1657</div> 1658<p><code>index</code>ã¢ã¯ã·ã§ã³ã®ã¨ãã¯ãè¤æ°ã®è£½åãèªã¿è¾¼ãããã«è¤æ°å½¢ã®<code>@products</code>ã使ãã¾ããã ããã®<code>show</code>ã¢ã¯ã·ã§ã³ã¯ããã¼ã¿ãã¼ã¹ãã1ä»¶ã®ã¬ã³ã¼ããèªã¿è¾¼ãï¼ã¤ã¾ã1ä»¶ã®è£½åï¼one productï¼ã表示ããï¼ã®ã§ã<strong>åæ°å½¢ã®</strong><code>@product</code>ãå®ç¾©ãã¾ãã</p> 1659<p>ãã¼ã¿ãã¼ã¹ã«ã¯ã¨ãªããããã®ã«ä½¿ããªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã«ã¯ã<code>params</code>ã§ã¢ã¯ã»ã¹ãã¾ãã 1660ãã®å ´åã<code>/products/:id</code>ã«ã¼ãã£ã³ã°ã®<code>:id</code>ã使ããã¾ãã 1661ã¦ã¼ã¶ã¼ããã©ã¦ã¶ã§<code>/products/1</code>ã«ã¢ã¯ã»ã¹ããã¨ã<code>params</code>ããã·ã¥ã«<code>{id: 1}</code>ãå«ã¾ããã®ã§ã<code>show</code>ã¢ã¯ã·ã§ã³ã§<code>Product.find(1)</code>ãå¼ã³åºãã¨ãIDã<code>1</code>ã®è£½åããã¼ã¿ãã¼ã¹ããèªã¿è¾¼ã¾ãã¾ãã</p> 1662<p>次ã«ã<code>show</code>ã¢ã¯ã·ã§ã³ã«å¯¾å¿ãããã¥ã¼ãå¿ è¦ã§ãã<code>ProductsController</code>ã¯Railsã®å½åè¦åã«æ²¿ã£ã¦ã<code>app/views/</code>ãã©ã«ãã®ä¸ã®<code>products/</code>ã¨ããååã®ãµããã©ã«ãã«ãã¥ã¼ãã¡ã¤ã«ãç½®ããã¦ãããã¨ãæ³å®ãã¦ãã¾ãã</p> 1663<p><code>show</code>ã¢ã¯ã·ã§ã³ãå¿ è¦ã¨ãã¦ãã<code>app/views/products/show.html.erb</code>ãã¡ã¤ã«ãã¨ãã£ã¿ã§ä½æãã¦ã以ä¸ã®å 容ã追å ãã¾ãã</p> 1664<div class="code_container"> 1665<pre class="highlight"> 1666<span class="c"><%# app/views/products/show.html.erb %></span> 1667<span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 1668 1669<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Back"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span> 1670</pre> 1671</div> 1672<p>indexãã¼ã¸ã«åå¥ã®showãã¼ã¸ã¸ã®ãªã³ã¯ã追å ãã¦ãã¯ãªãã¯ãã¦åå¥ã®è£½åãã¼ã¸ã«ç§»åã§ããããã«ãã¦ããã¨ä¾¿å©ã§ãã</p> 1673<p>ããã§ã<code>app/views/products/index.html.erb</code>ãã¥ã¼ã以ä¸ã®ããã«æ´æ°ãã¦ãæ°ããä½ã£ãshowãã¼ã¸ã¸ã®ãªã³ã¯ã追å ãã¾ãããã<code>show</code>ã¢ã¯ã·ã§ã³ã¸ã®ãã¹ã«ã¯<code><a></code>ã¿ã°ãå©ç¨ã§ãã¾ãã</p> 1674<div class="code_container"> 1675<pre class="highlight"> 1676<span class="c"><%# app/views/products/index.html.erb %></span> 1677<span class="nt"><h1></span>Products<span class="nt"></h1></span> 1678 1679<span class="nt"><div</span> <span class="na">id=</span><span class="s">
1679"products"</span><span class="nt">></span> 1680 <span class="cp"><%</span> <span class="vi">@products</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">product</span><span class="o">|</span> <span class="cp">%></span> 1681 <span class="nt"><div></span> 1682 <span class="nt"><a</span> <span class="na">href=</span><span class="s">"/products/</span><span class="cp"><%=</span> <span class="n">product</span><span class="p">.</span><span class="nf">id</span> <span class="cp">%></span><span class="s">"</span><span class="nt">></span> 1683 <span class="cp"><%=</span> <span class="n">product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span> 1684 <span class="nt"></a></span> 1685 <span class="nt"></div></span> 1686 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1687<span class="nt"></div></span> 1688</pre> 1689</div> 1690<p>ãã©ã¦ã¶ã§indexãã¼ã¸ãåèªã¿è¾¼ã¿ããã¨ãæå¾ éãã«ãªã³ã¯ã表示ããããã¨ããããã¾ãã 1691ãããããã¯ããã«æ¹åã§ãã¾ãã</p> 1692<p>Railsã¯ããã¹ã¨URLãçæããããã®ãã«ãã¼ã¡ã½ãããæä¾ãã¾ãã 1693<code>bin/rails routes</code>ãå®è¡ããã¨ä»¥ä¸ã®ããã«è¡¨ç¤ºãããPrefixåã®<code>products</code>ã<code>product</code>ã¯ãRubyã³ã¼ãã§URLãçæã§ãããã«ãã¼ã¡ã½ããåã«å¯¾å¿ãã¾ãã</p> 1694<div class="code_container"> 1695<pre class="highlight"> 1696 Prefix Verb URI Pattern Controller#Action 1697products GET /products(.:format) products#index 1698 product GET /products/:id(.:format) products#show 1699</pre> 1700</div> 1701<p>ãããã®ã«ã¼ãã£ã³ã°ãã¬ãã£ãã¯ã¹ã«å¯¾å¿ãããã«ãã¼ã¡ã½ããã¯ã以ä¸ã®ããã«ãªãã¾ãã</p> 1702<ul> 1703<li> 1704<code>products_path</code>: <code>"/products"</code>ã¨ãããã¹ãçæãã</li> 1705<li> 1706<code>products_url</code>: <code>"http://localhost:3000/products"</code>ã¨ããURLãçæãã</li> 1707<li> 1708<code>product_path(1)</code>: <code>"/products/1"</code>ã¨ãããã¹ãçæãã</li> 1709<li> 1710<code>product_url(1)</code>: <code>"http://localhost:3000/products/1"</code>ã¨ããURLãçæãã</li> 1711</ul> 1712<p><code>ãã¬ãã£ãã¯ã¹å_path</code>ã¯ããã©ã¦ã¶ãç¾å¨ã®ãã¡ã¤ã³ã§ããã¨çè§£ããç¸å¯¾ãã¹ãè¿ãã¾ãã</p> 1713<p><code>ãã¬ãã£ãã¯ã¹å_url</code>ã¯ãããããã³ã«ãããã¹ããããã¼ãçªå·ããå«ãå®å ¨ãªURLãè¿ãã¾ãã</p> 1714<p>URLãã«ãã¼ã¯ããã©ã¦ã¶ã®å¤é¨ã§è¡¨ç¤ºãããã¡ã¼ã«ãã¬ã³ããªã³ã°ããå ´åã«ä¾¿å©ã§ãã</p> 1715<p>URLãã«ãã¼ã<code>link_to</code>ãã«ãã¼ã«ãã<code><a></code>ã¿ã°çæã¨çµã¿åãããã¨ãã¿ã°ãç´æ¥æ¸ããã«Rubyã ãã§ãããã«ãªã³ã¯ãçæã§ããããã«ãªãã¾ãã<code>link_to</code>ã«ã¯ããªã³ã¯ã®è¡¨ç¤ºåï¼ããã§ã¯<code>product.name</code>ï¼ã¨ã<code>href</code>屿§ã§ä½¿ããªã³ã¯å ã®ãã¹ã¾ãã¯URLï¼ããã§ã¯<code>product</code>ï¼ã渡ãã¾ãã</p> 1716<p>ãããã®ãã«ãã¼ã使ã£ã¦<code>app/views/products/index.html.erb</code>ããªãã¡ã¯ã¿ãªã³ã°ããã¨ã以ä¸ã®ããã«ç°¡æ½ãªãã¥ã¼ã³ã¼ãã«ãªãã¾ãã</p> 1717<div class="code_container"> 1718<pre class="highlight"> 1719<span class="c"><%# app/views/products/index.html.erb %></span> 1720<span class="nt"><h1></span>Products<span class="nt"></h1></span> 1721 1722<span class="nt"><div</span> <span class="na">id=</span><span class="s">"products"</span><span class="nt">></span> 1723 <span class="cp"><%</span> <span class="vi">@products</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">product</span><span class="o">|</span> <span class="cp">%></span> 1724 <span class="nt"><div></span> 1725 <span class="cp"><%=</span> <span class="n">link_to</span> <span class="n">product</span><span class="p">.</span><span class="nf">name</span><span class="p">,</span> <span class="n">product_path</span><span class="p">(</span><span class="n">product</span><span class="p">.</span><span class="nf">id</span><span class="p">)</span> <span class="cp">%></span> 1726 <span class="nt"></div></span> 1727 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1728<span class="nt"></div></span> 1729</pre> 1730</div>
1731<h4 id="製åã使ãã"><a class="anchorlink" href="#%E8%A3%BD%E5%93%81%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">10.5 製åã使ãã</a></h4> 1732<p>ããã¾ã§ã¯è£½åãRailsã³ã³ã½ã¼ã«ã§ä½æããããããã¾ããã§ããããä»åº¦ã¯ãã©ã¦ã¶ã§è£½åã使ã§ããããã«ãã¾ãããã</p> 1733<p>製åã使ããã«ã¯ã以ä¸ã®2ã¤ã®ã¢ã¯ã·ã§ã³ã使ããå¿ è¦ãããã¾ãã</p> 1734<ol> 1735<li> 1736<code>new</code>ã¢ã¯ã·ã§ã³: è£½åæ å ±ãåéããããã®ãã©ã¼ã ã使ãã</li> 1737<li> 1738<code>create</code>ã¢ã¯ã·ã§ã³: 製åãä¿åãã¦ã¨ã©ã¼ããã§ãã¯ãã</li> 1739</ol> 1740<p>ã¾ãã¯ã³ã³ããã¼ã©ã§<code>new</code>ã¢ã¯ã·ã§ã³ã使ãã¾ãããã</p> 1741<div class="code_container"> 1742<pre class="highlight"> 1743<span class="c1"># app/controllers/products_controller.rb</span> 1744<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1745 <span class="k">def</span> <span class="nf">index</span> 1746 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 1747 <span class="k">end</span> 1748 1749 <span class="k">def</span> <span class="nf">show</span> 1750 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 1751 <span class="k">end</span> 1752 1753 <span class="k">def</span> <span class="nf">new</span> 1754 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span> 1755 <span class="k">end</span> 1756<span class="k">end</span> 1757</pre> 1758</div> 1759<p><code>new</code>ã¢ã¯ã·ã§ã³ã¯ããã©ã¼ã ãã£ã¼ã«ãã®è¡¨ç¤ºã§ä½¿ãæ°ãã<code>Product</code>ãã¤ã³ã¹ã¿ã³ã¹åãã¾ãã</p> 1760<p>次ã¯<code>app/views/products/index.html.erb</code>ã以ä¸ã®ããã«æ´æ°ãã¦ã<code>new</code>ã¢ã¯ã·ã§ã³ã«ãªã³ã¯ã§ããããã«ãã¾ãã</p> 1761<div class="code_container"> 1762<pre class="highlight"> 1763<span class="c"><%# app/views/products/index.html.erb %></span> 1764<span class="nt"><h1></span>Products<span class="nt"></h1></span> 1765 1766<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"New product"</span><span class="p">,</span> <span class="n">new_product_path</span> <span class="cp">%></span> 1767 1768<span class="nt"><div</span> <span class="na">id=</span><span class="s">"products"</span><span class="nt">></span> 1769 <span class="cp"><%</span> <span class="vi">@products</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">product</span><span class="o">|</span> <span class="cp">%></span> 1770 <span class="nt"><div></span> 1771 <span class="cp"><%=</span> <span class="n">link_to</span> <span class="n">product</span><span class="p">.</span><span class="nf">name</span><span class="p">,</span> <span class="n">product_path</span><span class="p">(</span><span class="n">product</span><span class="p">.</span><span class="nf">id</span><span class="p">)</span> <span class="cp">%></span> 1772 <span class="nt"></div></span> 1773 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1774<span class="nt"></div></span> 1775</pre> 1776</div> 1777<p><code>new</code>ã¢ã¯ã·ã§ã³ã«å¯¾å¿ãã<code>app/views/products/new.html.erb</code>ãã¥ã¼ãã³ãã¬ã¼ãã以ä¸ã®å 容ã§ä½æãã¦ãæ°ãã<code>Product</code>ã®ãã©ã¼ã ãã¬ã³ããªã³ã°ã§ããããã«ãã¾ãã</p> 1778<div class="code_container"> 1779<pre class="highlight"> 1780<span class="c"><%# app/views/products/new.html.erb %></span> 1781<span class="nt"><h1></span>New product<span class="nt"></h1></span> 1782 1783<span class="cp"><%=</span> <span class="n">form_with</span> <span class="ss">model: </span><span class="vi">@product</span> <span class="k">do</span> <span class="o">|</span><span class="n">form</span><span class="o">|</span> <span class="cp">%></span> 1784 <span class="nt"><div></span> 1785 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">label</span> <span class="ss">:name</span> <span class="cp">%></span> 1786 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">text_field</span> <span class="ss">:name</span> <span class="cp">%></span> 1787 <span class="nt"></div></span> 1788 1789 <span class="nt"><div></span> 1790 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">submit</span> <span class="cp">%></span> 1791 <span class="nt"></div></span> 1792<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1793 1794<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">
1794"Cancel"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span> 1795</pre> 1796</div> 1797<p>ãã®<code>new.html.erb</code>ãã¥ã¼ã§ã¯ãRailsã®<code>form_with</code>ãã«ãã¼ã製å使ç¨ã®HTMLãã©ã¼ã çæã«å©ç¨ãã¦ãã¾ãããã®<code>form_with</code>ãã«ãã¼ã¯ã<strong>ãã©ã¼ã ãã«ãã¼</strong>ãç¨ãã¦CSRFãã¼ã¯ã³çæãªã©ã®å¦çãè¡ãã<code>model:</code>ã§æå®ããããã®ã«åºã¥ãã¦URLãçæããã¨ã¨ãã«ãéä¿¡ãã¿ã³ã®ããã¹ãã«ã¢ãã«åãåæ ãããã¨ã¾ã§è¡ãã¾ãã</p> 1798<p>ãã®ãã¼ã¸ããã©ã¦ã¶ã§éãã¦ã½ã¼ã¹ã表示ããã¨ããã©ã¼ã ã®HTMLã¯ä»¥ä¸ã®ããã«ãªãã¾ãã</p> 1799<div class="code_container"> 1800<pre class="highlight"> 1801<span class="nt"><form</span> <span class="na">action=</span><span class="s">"/products"</span> <span class="na">accept-charset=</span><span class="s">"UTF-8"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">></span> 1802 <span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"authenticity_token"</span> <span class="na">value=</span><span class="s">"UHQSKXCaFqy_aoK760zpSMUPy6TMnsLNgbPMABwN1zpW-Jx6k-2mISiF0ulZOINmfxPdg5xMyZqdxSW1UK-H-Q"</span> <span class="na">autocomplete=</span><span class="s">"off"</span><span class="nt">></span> 1803 1804 <span class="nt"><div></span> 1805 <span class="nt"><label</span> <span class="na">for=</span><span class="s">"product_name"</span><span class="nt">></span>Name<span class="nt"></label></span> 1806 <span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"product[name]"</span> <span class="na">id=</span><span class="s">"product_name"</span><span class="nt">></span> 1807 <span class="nt"></div></span> 1808 1809 <span class="nt"><div></span> 1810 <span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">name=</span><span class="s">"commit"</span> <span class="na">value=</span><span class="s">"Create Product"</span> <span class="na">data-disable-with=</span><span class="s">"Create Product"</span><span class="nt">></span> 1811 <span class="nt"></div></span> 1812<span class="nt"></form></span> 1813</pre> 1814</div> 1815<p>Railsã®ãã©ã¼ã ãã«ãã¼ã«ãã£ã¦ãã»ãã¥ãªãã£ç¨ã®CSRFãã¼ã¯ã³ãUTF-8ãµãã¼ãç¨ã®<code>accept-charset="UTF-8"</code>屿§ããã©ã¼ã ã«çµã¿è¾¼ã¾ããåå¥ã®å ¥åãã£ã¼ã«ãåãè¨å®ããã<code>Create Product</code>éä¿¡ãã¿ã³ãäºééä¿¡ãç¡å¹ãªç¶æ ã§è¿½å ããã¦ãã¾ãã</p> 1816<p>ãã©ã¼ã ãã«ãã¼ã«æ°ãã<code>Product</code>ã¤ã³ã¹ã¿ã³ã¹ã渡ããã®ã§ãæ°è¦ã¬ã³ã¼ã使ç¨ã®ããã©ã«ãã«ã¼ãã£ã³ã°ã§ãã<code>/products</code>ãã¹ã«<code>POST</code>ãªã¯ã¨ã¹ããéä¿¡ããããã«æ§æããããã©ã¼ã ããèªåçã«çæããã¾ããã</p> 1817<p>ããããéä¿¡ããããã©ã¼ã ãå¦çããã«ã¯ãã¾ãã³ã³ããã¼ã©ã«<code>create</code>ã¢ã¯ã·ã§ã³ã以ä¸ã®ããã«å®è£ ããå¿ è¦ãããã¾ãã</p> 1818<div class="code_container"> 1819<pre class="highlight"> 1820<span class="c1"># app/controllers/products_controller.rb</span> 1821<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1822 <span class="k">def</span> <span class="nf">index</span> 1823 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 1824 <span class="k">end</span> 1825 1826 <span class="k">def</span> <span class="nf">show</span> 1827 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 1828 <span class="k">end</span> 1829 1830 <span class="k">def</span> <span class="nf">new</span> 1831 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span> 1832 <span class="k">end</span> 1833 1834 <span class="k">def</span> <span class="nf">create</span> 1835 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 1836 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">save</span>
1837 <span class="n">redirect_to</span> <span class="vi">@product</span> 1838 <span class="k">else</span> 1839 <span class="n">render</span> <span class="ss">:new</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 1840 <span class="k">end</span> 1841 <span class="k">end</span> 1842 1843 <span class="kp">private</span> 1844 <span class="k">def</span> <span class="nf">product_params</span> 1845 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span> <span class="p">])</span> 1846 <span class="k">end</span> 1847<span class="k">end</span> 1848</pre> 1849</div> 1850<h5 id="strong-parameters"><a class="anchorlink" href="#strong-parameters">10.5.1 Strong Parameters</a></h5> 1851<p><code>create</code>ã¢ã¯ã·ã§ã³ã¯ãã©ã¼ã ããéä¿¡ããããã¼ã¿ãå¦çãã¾ãããã»ãã¥ãªãã£ã®ããã«ãã©ã¡ã¼ã¿ããã£ã«ã¿ãªã³ã°ãã¦ãããªããã°ãªãã¾ãããããã§å½¹ã«ç«ã¤ã®ããprivateã¡ã½ããã¨ãã¦è¿½å ãã<code>product_params</code>ã¡ã½ããã§ãã</p> 1852<div class="info"><p>訳注: ã¡ã½ããåã®<code>product</code>ã®é¨åã¯ã¢ãã«åã¨åãåæ°å½¢ã«ããã®ãæ £ä¾ã§ãã</p></div> 1853<p><code>product_params</code>ã¡ã½ããã¯ããªã¯ã¨ã¹ãã§åãåã£ããã©ã¡ã¼ã¿ãæ¤æ»ãã¦ããã©ã¡ã¼ã¿ã®é åãå¤ã¨ãã¦æã¤<code>:product</code>ã¨ãããã¼ãå¿ ãåå¨ãããã¨ãä¿è¨¼ãã¾ããããã§ã¯ã製åã«è¨±å¯ããã¦ãããã©ã¡ã¼ã¿ã¯<code>:name</code>ã®ã¿ãªã®ã§ããã以å¤ã®ã©ããªãã©ã¡ã¼ã¿ãRailsã«æ¸¡ãã¦ãç¡è¦ããã¾ãï¼ã¨ã©ã¼ã«ã¯ãªãã¾ããï¼ãããã«ãããã¢ããªã±ã¼ã·ã§ã³ããããã³ã°ãããã¨ããæªæã®ããã¦ã¼ã¶ã¼ããã¢ããªã±ã¼ã·ã§ã³ãä¿è·ããã¾ãã</p> 1854<p>詳ããã¯<a href="action_controller_overview.html#strong-parameters">Strong Parameter</a>ãåç §ãã¦ãã ããã</p> 1855<h5 id="ã¨ã©ã¼å¦ç"><a class="anchorlink" href="#%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%A6%E7%90%86">10.5.2 ã¨ã©ã¼å¦ç</a></h5> 1856<p><code>product_params</code>ã使ã£ã¦ãããã®ãã©ã¡ã¼ã¿ãæ°ãã<code>Product</code>ã«å²ãå½ã¦ããããã¼ã¿ãã¼ã¹ã¸ã®ä¿åã試ã¿ãæºåãæ´ãã¾ãã<code>@product.save</code>ã¯ãããªãã¼ã·ã§ã³ãå®è¡ãã¦ã¬ã³ã¼ãããã¼ã¿ãã¼ã¹ã«ä¿åããããActive Recordã«æç¤ºãã¾ãã</p> 1857<p><code>save</code>ãæåããã¨ãæ°ãã製åã®showãã¼ã¸ã«ãªãã¤ã¬ã¯ããã¾ãã<code>redirect_to</code>ã« Active Recordãªãã¸ã§ã¯ããæ¸¡ãã¨ããã®ã¬ã³ã¼ãã®<code>show</code>ã¢ã¯ã·ã§ã³ã¸ã®ãã¹ãçæããã¾ãã</p> 1858<div class="code_container"> 1859<pre class="highlight"> 1860<span class="n">redirect_to</span> <span class="vi">@product</span> 1861</pre> 1862</div> 1863<p>ä¸ãå®è¡ããã¨ã<code>@product</code>ã¯<code>Product</code>ã¢ãã«ã®ã¤ã³ã¹ã¿ã³ã¹ãªã®ã§ããªãã¤ã¬ã¯ãç¨ã«<code>"/products/2"</code>ãã¹ãçæãã¾ãããã®ã¨ãããã¹å ã§ã¯ã¢ãã«å<code>Product</code>ãè¤æ°å½¢ã®<code>products</code>ã«ããããã§ããªãã¸ã§ã¯ãID <code>2</code>ãæ«å°¾ã«è¿½å ãã¾ãã</p> 1864<p><code>save</code>ã失æãã¦ãã¬ã³ã¼ããæå¹ã«ãªããªãã£ãå ´åãåããã©ã¼ã ãåã¬ã³ããªã³ã°ãã¦ãã¦ã¼ã¶ã¼ãç¡å¹ãªãã¼ã¿ãä¿®æ£ã§ããããã«ãã¾ãã<code>create</code>ã¢ã¯ã·ã§ã³ã®<code>else</code>ã§ã¯<code>render :new</code>ãã¬ã³ããªã³ã°ããããã«æç¤ºãã¦ãã¾ãã</p> 1865<p>Railsã¯<code>Products</code>ã³ã³ããã¼ã©ã«ãããã¨ãèªèãã¦ããã®ã§ã<code>app/views/products/new.html.erb</code>ãã¥ã¼ãã³ãã¬ã¼ããã¬ã³ããªã³ã°ããå¿ è¦ãããã¾ãã</p> 1866<p><code>create</code>ã¢ã¯ã·ã§ã³ã§ã¯<code>@product</code>夿°ãè¨å®æ¸ã¿ãªã®ã§ã<code>@product</code>ããã¼ã¿ãã¼ã¹ã«ä¿åã§ããªãã£ãå ´åã§ãããã®ãã¥ã¼ãã³ãã¬ã¼ããå度ã¬ã³ããªã³ã°ããã¨ãã©ã¼ã ã«<code>Product</code>ãã¼ã¿ãèªåçã«å ¥åããã¾ãã</p> 1867<p>ã¾ããHTTPã¹ãã¼ã¿ã¹ã<a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Status/422">422 Unprocessable Entity</a>ã«è¨å®ãã¦ããã©ã¦ã¶ã«ãã®<code>POST</code>ãªã¯ã¨ã¹ãã失æãããã¨ãä¼ãã¦ãããã«å¿ããå¦çã«åãã¾ãã</p>
1868<h4 id="製åãç·¨éãã"><a class="anchorlink" href="#%E8%A3%BD%E5%93%81%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B">10.6 製åãç·¨éãã</a></h4> 1869<p>ã¬ã³ã¼ããç·¨éããå¦çã¯ãã¬ã³ã¼ãã使ããå¦çã¨é常ã«ä¼¼ã¦ãã¾ããã¬ã³ã¼ã使ã§ã¯<code>new</code>ã¢ã¯ã·ã§ã³ã¨<code>create</code>ã¢ã¯ã·ã§ã³ã使ãã¾ããããã¬ã³ã¼ãç·¨éã§ã¯ä»£ããã«<code>edit</code>ã¢ã¯ã·ã§ã³ã¨<code>update</code>ã¢ã¯ã·ã§ã³ã使ãã¾ãã</p> 1870<p>ã³ã³ããã¼ã©ã§ä»¥ä¸ã®ã³ã¼ããå®è£ ãã¦ã¿ã¾ãããã</p> 1871<div class="code_container"> 1872<pre class="highlight"> 1873<span class="c1"># app/controllers/products_controller.rb</span> 1874<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1875 <span class="k">def</span> <span class="nf">index</span> 1876 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 1877 <span class="k">end</span> 1878 1879 <span class="k">def</span> <span class="nf">show</span> 1880 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 1881 <span class="k">end</span> 1882 1883 <span class="k">def</span> <span class="nf">new</span> 1884 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span> 1885 <span class="k">end</span> 1886 1887 <span class="k">def</span> <span class="nf">create</span> 1888 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 1889 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">save</span> 1890 <span class="n">redirect_to</span> <span class="vi">@product</span> 1891 <span class="k">else</span> 1892 <span class="n">render</span> <span class="ss">:new</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 1893 <span class="k">end</span> 1894 <span class="k">end</span> 1895 1896 <span class="k">def</span> <span class="nf">edit</span> 1897 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 1898 <span class="k">end</span> 1899 1900 <span class="k">def</span> <span class="nf">update</span> 1901 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 1902 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 1903 <span class="n">redirect_to</span> <span class="vi">@product</span> 1904 <span class="k">else</span> 1905 <span class="n">render</span> <span class="ss">:edit</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 1906 <span class="k">end</span> 1907 <span class="k">end</span> 1908 1909 <span class="kp">private</span> 1910 <span class="k">def</span> <span class="nf">product_params</span> 1911 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span> <span class="p">])</span> 1912 <span class="k">end</span> 1913<span class="k">end</span> 1914</pre> 1915</div> 1916<h5 id="ãã¥ã¼ããã¼ã·ã£ã«ã«åãåºã"><a class="anchorlink" href="#%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E3%83%91%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%81%AB%E5%88%87%E3%82%8A%E5%87%BA%E3%81%99">10.6.1 ãã¥ã¼ããã¼ã·ã£ã«ã«åãåºã</a></h5> 1917<p>æ°ãã製åã使ããããã®ãã©ã¼ã ã¯æ¢ã«ä½æãã¾ãããããã®ãã©ã¼ã ãç·¨éãæ´æ°ã®ãã©ã¼ã ã§ãåå©ç¨ã§ããã便å©ã ã¨æãã¾ãããï¼ããã¯ãè¤æ°ã®å ´æã§ãã¥ã¼ãåå©ç¨ã§ããããã«ãã<strong>ãã¼ã·ã£ã«</strong>ï¼partialï¼ã¨ããæ©è½ã使ã£ã¦ãã©ã¼ã ã<code>app/views/products/_form.html.erb</code>ã¨ãããã¼ã·ã£ã«ãã¡ã¤ã«ã«åãåºããã¨ã§å®ç¾ã§ãã¾ãã</p> 1918<p>ãã¼ã·ã£ã«ã®ãã¡ã¤ã«åã¯ãããããã¼ã·ã£ã«ã§ãããã¨ã示ãããã«ã¢ã³ãã¼ã¹ã³ã¢<code>_</code>ã§å§ã¾ãã¾ãã</p> 1919<p>ããã¨åæã«ããã¥ã¼ã§ä½¿ããã¦ããã¤ã³ã¹ã¿ã³ã¹å¤æ°ããã¹ã¦ãã¼ã«ã«å¤æ°ã«ç½®ãæãããã¨æãã¾ãããã¼ã«ã«å¤æ°ã¯ããã¼ã·ã£ã«ãã¬ã³ããªã³ã°ããã¨ãã«å®ç¾©ã§ãã¾ãããããè¡ãã«ã¯ããã¼ã·ã£ã«å ã®<code>@product</code>ã以ä¸ã®ããã«<code>product</code>ã«ç½®ãæãã¾ãããã®ã¨ãããã©ã¼ã éä¿¡ã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ããã©ã¼ã ã®ä¸é¨ã¨ãã¦è¡¨ç¤ºã§ããããã«ãã¦ããã¾ãã</p> 1920<div class="code_container"> 1921<pre class="highlight"> 1922<span class="c"><%# app/views/products/_form.html.erb %></span> 1923<span class="cp"><%=</span> <span class="n">form_with</span> <span class="ss">model: </span><span class="n">product</span> <span class="k">do</span> <span class="o">|</span><span class="n">form</span><span class="o">|</span> <span class="cp">%></span> 1924 <span class="cp"><%</span> <span class="k">if</span> <span class="n">form</span><span class="p">.</span><span class="nf">object</span><span class="p">.</span><span class="nf">errors</span><span class="p">.</span><span class="nf">any?</span> <span class="cp">%></span> 1925 <span class="nt"><p</span> <span class="na">class=</span><span class="s">
1925"error"</span><span class="nt">></span><span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">object</span><span class="p">.</span><span class="nf">errors</span><span class="p">.</span><span class="nf">full_messages</span><span class="p">.</span><span class="nf">first</span> <span class="cp">%></span><span class="nt"></p></span> 1926 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1927 1928 <span class="nt"><div></span> 1929 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">label</span> <span class="ss">:name</span> <span class="cp">%></span> 1930 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">text_field</span> <span class="ss">:name</span> <span class="cp">%></span> 1931 <span class="nt"></div></span> 1932 1933 <span class="nt"><div></span> 1934 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">submit</span> <span class="cp">%></span> 1935 <span class="nt"></div></span> 1936<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 1937</pre> 1938</div> 1939<div class="info"><p>ãã¼ã«ã«å¤æ°ã使ãã¨ãå¤ã ããç°ãªããã¼ã·ã£ã«ãåããã¼ã¸ã§ç¹°ãè¿ãåå©ç¨ã§ããããã«ãªãã¾ããããã¯ãindexãã¼ã¸ã®ããã«å¤æ°ã®ã¢ã¤ãã ã®ãªã¹ããã¬ã³ããªã³ã°ããã¨ãã«ä¾¿å©ã§ãã</p></div> 1940<p>使ãããã®ãã¼ã·ã£ã«ã<code>app/views/products/new.html.erb</code>ãã¥ã¼ã§ä½¿ãã«ã¯ããã©ã¼ã ã®é¨åã以ä¸ã®ããã«ãã¼ã·ã£ã«ã®<code>render</code>å¼ã³åºãã«ç½®ãæãã¾ãã</p> 1941<div class="code_container"> 1942<pre class="highlight"> 1943<span class="c"><%# app/views/products/new.html.erb %></span> 1944<span class="nt"><h1></span>New product<span class="nt"></h1></span> 1945 1946<span class="cp"><%=</span> <span class="n">render</span> <span class="s2">"form"</span><span class="p">,</span> <span class="ss">product: </span><span class="vi">@product</span> <span class="cp">%></span> 1947<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Cancel"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span> 1948</pre> 1949</div> 1950<p>Editãã¥ã¼ãããã©ã¼ã ã®<code>_form.html.erb</code>ãã¼ã·ã£ã«ã®ãããã§ãNewãã¥ã¼ã¨ã»ã¼åãããã«æ¸ãã¾ãã</p> 1951<p>以ä¸ã®å 容ã§<code>app/views/products/edit.html.erb</code>ã使ãã¾ãããã</p> 1952<div class="code_container"> 1953<pre class="highlight"> 1954<span class="c"><%# app/views/products/edit.html.erb %></span> 1955<span class="nt"><h1></span>Edit product<span class="nt"></h1></span> 1956 1957<span class="cp"><%=</span> <span class="n">render</span> <span class="s2">"form"</span><span class="p">,</span> <span class="ss">product: </span><span class="vi">@product</span> <span class="cp">%></span> 1958<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Cancel"</span><span class="p">,</span> <span class="vi">@product</span> <span class="cp">%></span> 1959</pre> 1960</div> 1961<p>ãã¥ã¼ã®ãã¼ã·ã£ã«ã«ã¤ãã¦è©³ããã¯ã<a href="action_view_overview.html#%E3%83%91%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB">Action Viewã¬ã¤ã</a>ãåç §ãã¦ãã ããã</p> 1962<p>次ã«ã<code>app/views/products/show.html.erb</code>ãã¥ã¼ãã³ãã¬ã¼ãã«Editãã¼ã¸ã¸ã®ãªã³ã¯ã追å ãã¾ãã</p> 1963<div class="code_container"> 1964<pre class="highlight"> 1965<span class="c"><%# app/views/products/show.html.erb %></span> 1966<span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 1967 1968<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Back"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span> 1969<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Edit"</span><span class="p">,</span> <span class="n">edit_product_path</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> 1970</pre> 1971</div> 1972<h5 id="before-actionã³ã¼ã«ããã¯ã§ã³ã¼ããdryã«ãã"><a class="anchorlink" href="#before-action%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92dry%E3%81%AB%E3%81%99%E3%82%8B">10.6.2 <code>before_action</code>ã³ã¼ã«ããã¯ã§ã³ã¼ããDRYã«ãã</a></h5> 1973<p><code>edit</code>ã¢ã¯ã·ã§ã³ã¨<code>update</code>ã¢ã¯ã·ã§ã³ã¯ã<code>show</code>ã¨åæ§ã«æ¢åã®ãã¼ã¿ãã¼ã¹ã¬ã³ã¼ããåå¨ãã¦ããå¿ è¦ãããã¾ãã<code>before_action</code>ã使ããã¨ã§ããã®ããã®åãã³ã¼ãã®éè¤ãæé¤ã§ãã¾ãã</p> 1974<p><code>before_action</code>ã使ãã¨ãã¢ã¯ã·ã§ã³éã§å ±æããã¦ããã³ã¼ããæ½åºãã¦ãã¢ã¯ã·ã§ã³ã®<strong>ç´å</strong>ã«å®è¡ã§ãã¾ãã</p> 1975<p>ä¸ã®ã³ã³ããã¼ã©ã§ã¯ã<code>@product = Product.find(params[:id])</code>ã¨ããåãã³ã¼ãã<code>show</code>ã<code>edit</code>ã<code>update</code>ã¨ãã3ã¤ã®ç°ãªãã¡ã½ããã§å®ç¾©ããã¦ãã¾ãããã®ã¯ã¨ãªã<code>set_product</code>ã¨ããbeforeã¢ã¯ã·ã§ã³ã«æ½åºãã¦ããã°ã3ã¤ã®ã¢ã¯ã·ã§ã³ã§åãã³ã¼ããæ¸ããã«æ¸ãã®ã§ã³ã¼ããç°¡æ½ã«ãªãã¾ãã</p> 1976<p>
1976ããã¯ãDRYï¼Don't Repeat Yourself: ç¹°ãè¿ããé¿ããï¼ååãå®éã«æ©è½ãã¦ããè¯ãä¾ã§ãã</p> 1977<div class="code_container"> 1978<pre class="highlight"> 1979<span class="c1"># app/controllers/products_controller.rb</span> 1980<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 1981 <span class="n">before_action</span> <span class="ss">:set_product</span><span class="p">,</span> <span class="ss">only: </span><span class="sx">%i[ show edit update ]</span> 1982 1983 <span class="k">def</span> <span class="nf">index</span> 1984 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 1985 <span class="k">end</span> 1986 1987 <span class="k">def</span> <span class="nf">show</span> 1988 <span class="k">end</span> 1989 1990 <span class="k">def</span> <span class="nf">new</span> 1991 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span> 1992 <span class="k">end</span> 1993 1994 <span class="k">def</span> <span class="nf">create</span> 1995 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 1996 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">save</span> 1997 <span class="n">redirect_to</span> <span class="vi">@product</span> 1998 <span class="k">else</span> 1999 <span class="n">render</span> <span class="ss">:new</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 2000 <span class="k">end</span> 2001 <span class="k">end</span> 2002 2003 <span class="k">def</span> <span class="nf">edit</span> 2004 <span class="k">end</span> 2005 2006 <span class="k">def</span> <span class="nf">update</span> 2007 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 2008 <span class="n">redirect_to</span> <span class="vi">@product</span> 2009 <span class="k">else</span> 2010 <span class="n">render</span> <span class="ss">:edit</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 2011 <span class="k">end</span> 2012 <span class="k">end</span> 2013 2014 <span class="kp">private</span> 2015 <span class="k">def</span> <span class="nf">set_product</span> 2016 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 2017 <span class="k">end</span> 2018 2019 <span class="k">def</span> <span class="nf">product_params</span> 2020 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span> <span class="p">])</span> 2021 <span class="k">end</span> 2022<span class="k">end</span> 2023</pre> 2024</div> 2025<h4 id="製åãåé¤ãã"><a class="anchorlink" href="#%E8%A3%BD%E5%93%81%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">10.7 製åãåé¤ãã</a></h4> 2026<p>å®è£ ãå¿ è¦ãªæå¾ã®æ©è½ã¯ã製åã®åé¤ã§ãã 2027<code>DELETE /products/:id</code>ãªã¯ã¨ã¹ããå¦çããããã«ã<code>ProductsController</code>ã«<code>destroy</code>ã¢ã¯ã·ã§ã³ã追å ãã¾ãããã</p> 2028<p><code>before_action :set_product</code>ã³ã¼ã«ããã¯ã«<code>destroy</code>ã追å ããã¨ãä»ã®ã¢ã¯ã·ã§ã³ã¨åãæ¹æ³ã§<code>@product</code>ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãè¨å®ã§ããããã«ãªãã¾ãã</p> 2029<div class="code_container"> 2030<pre class="highlight"> 2031<span class="c1"># app/controllers/products_controller.rb</span> 2032<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 2033 <span class="n">before_action</span> <span class="ss">:set_product</span><span class="p">,</span> <span class="ss">only: </span><span class="sx">%i[ show edit update destroy ]</span> 2034 2035 <span class="k">def</span> <span class="nf">index</span> 2036 <span class="vi">@products</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">all</span> 2037 <span class="k">end</span> 2038 2039 <span class="k">def</span> <span class="nf">show</span> 2040 <span class="k">end</span> 2041 2042 <span class="k">def</span> <span class="nf">new</span> 2043 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span> 2044 <span class="k">end</span> 2045 2046 <span class="k">def</span> <span class="nf">create</span> 2047 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 2048 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">save</span>
2049 <span class="n">redirect_to</span> <span class="vi">@product</span> 2050 <span class="k">else</span> 2051 <span class="n">render</span> <span class="ss">:new</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 2052 <span class="k">end</span> 2053 <span class="k">end</span> 2054 2055 <span class="k">def</span> <span class="nf">edit</span> 2056 <span class="k">end</span> 2057 2058 <span class="k">def</span> <span class="nf">update</span> 2059 <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">product_params</span><span class="p">)</span> 2060 <span class="n">redirect_to</span> <span class="vi">@product</span> 2061 <span class="k">else</span> 2062 <span class="n">render</span> <span class="ss">:edit</span><span class="p">,</span> <span class="ss">status: :unprocessable_entity</span> 2063 <span class="k">end</span> 2064 <span class="k">end</span> 2065 2066 <span class="k">def</span> <span class="nf">destroy</span> 2067 <span class="vi">@product</span><span class="p">.</span><span class="nf">destroy</span> 2068 <span class="n">redirect_to</span> <span class="n">products_path</span> 2069 <span class="k">end</span> 2070 2071 <span class="kp">private</span> 2072 <span class="k">def</span> <span class="nf">set_product</span> 2073 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span> 2074 <span class="k">end</span> 2075 2076 <span class="k">def</span> <span class="nf">product_params</span> 2077 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span> <span class="p">])</span> 2078 <span class="k">end</span> 2079<span class="k">end</span> 2080</pre> 2081</div> 2082<p>製åãåé¤ã§ããããã«ããã«ã¯ã<code>app/views/products/show.html.erb</code>ã§ä»¥ä¸ã®ããã«Deleteãã¿ã³ã追å ããå¿ è¦ãããã¾ãã</p> 2083<div class="code_container"> 2084<pre class="highlight"> 2085<span class="c"><%# app/views/products/show.html.erb %></span> 2086<span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 2087 2088<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Back"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span> 2089<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Edit"</span><span class="p">,</span> <span class="n">edit_product_path</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> 2090<span class="cp"><%=</span> <span class="n">button_to</span> <span class="s2">"Delete"</span><span class="p">,</span> <span class="vi">@product</span><span class="p">,</span> <span class="ss">method: :delete</span><span class="p">,</span> <span class="ss">data: </span><span class="p">{</span> <span class="ss">turbo_confirm: </span><span class="s2">"Are you sure?"</span> <span class="p">}</span> <span class="cp">%></span> 2091</pre> 2092</div> 2093<p><code>button_to</code>ã¯ãDeleteã¨ããããã¹ãã表示ããããã¿ã³ã1ã¤æã¤ãã©ã¼ã ãçæãã¾ãããã®ãã¿ã³ãã¯ãªãã¯ããã¨ããã©ã¼ã ã<code>/products/:id</code>ã«<code>DELETE</code>ãªã¯ã¨ã¹ãã¨ãã¦éä¿¡ãããã³ã³ããã¼ã©ã®<code>destroy</code>ã¢ã¯ã·ã§ã³ãããªã¬ã¼ããã¾ãã</p> 2094<p>ãªãã<code>turbo_confirm</code>ãã¼ã¿å±æ§ã¯ããã©ã¼ã ãéä¿¡ããåã«ã¦ã¼ã¶ã¼ã«ç¢ºèªãã¤ã¢ãã°ã表示ããããã«Turboã¨ããJavaScriptã©ã¤ãã©ãªã«æç¤ºãã¾ããããã«ã¤ãã¦ã¯ãå¾ã»ã©è©³ãã説æãã¾ãã</p> 2095<h3 id="èªè¨¼æ©è½ã追å ãã"><a class="anchorlink" href="#%E8%AA%8D%E8%A8%BC%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">11 èªè¨¼æ©è½ã追å ãã</a></h3> 2096<p>ä»ã®ã¾ã¾ã§ã¯èª°ã§ã製åãç·¨éã»åé¤ã§ãã¦ãã¾ãã®ã§ãå®å ¨ã§ã
2096¯ããã¾ããã製å管çã§ã¦ã¼ã¶ã¼èªè¨¼ãå¿ é ã«ãããã¨ã§ãã»ãã¥ãªãã£ãå¼·åãã¾ãããã</p> 2097<p>ããã§ã¯ãRailsã«ä»å±ãã¦ããèªè¨¼æ©è½ã¸ã§ãã¬ã¼ã¿ãå©ç¨ã§ãã¾ãããã®èªè¨¼æ©è½ã¸ã§ãã¬ã¼ã¿ã使ã£ã¦ã<code>User</code>ã¢ãã«ã¨<code>Session</code>ã¢ãã«ãã¢ããªã±ã¼ã·ã§ã³ã«ãã°ã¤ã³ããããã«å¿ è¦ãªã³ã³ããã¼ã©ã¨ãã¥ã¼ã使ã§ãã¾ãã</p> 2098<p>åã³ã¿ã¼ããã«ãéãã¦ã以ä¸ã®èªè¨¼æ©è½ã¸ã§ãã¬ã¼ã¿ã³ãã³ããå®è¡ãã¾ãã</p> 2099<div class="code_container"> 2100<pre class="highlight"> 2101<span class="gp">$</span><span class="w"> </span>bin/rails generate authentication 2102</pre> 2103</div> 2104<p>ç¶ãã¦ä»¥ä¸ã®ãã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã<code>User</code>ã¢ãã«ç¨ã®<code>users</code>ãã¼ãã«ã¨ã<code>Session</code>ã¢ãã«ç¨ã®<code>sessions</code>ãã¼ãã«ããã¼ã¿ãã¼ã¹ã«è¿½å ãã¾ãã</p> 2105<div class="code_container"> 2106<pre class="highlight"> 2107<span class="gp">$</span><span class="w"> </span>bin/rails db:migrate 2108</pre> 2109</div> 2110<p>ã¦ã¼ã¶ã¼ã使ããããã«ãRailsã³ã³ã½ã¼ã«ãéãã¾ãã</p> 2111<div class="code_container"> 2112<pre class="highlight"> 2113<span class="gp">$</span><span class="w"> </span>bin/rails console 2114</pre> 2115</div> 2116<p>Railsã³ã³ã½ã¼ã«ã§ã¦ã¼ã¶ã¼ã使ããã«ã¯ã<code>User.create!</code>ã¡ã½ãããå®è¡ãã¾ãã以ä¸ã®ä¾ã®éãã§ãªãã¦ãæ§ããªãã®ã§ãç¬èªã®ã¡ã¼ã«ã¢ãã¬ã¹ããã¹ã¯ã¼ããèªç±ã«ä½¿ãã¾ãã</p> 2117<div class="code_container"> 2118<pre class="highlight"> 2119store(dev)> User.create! email_address: "[email protected]", password: "s3cr3t", password_confirmation: "s3cr3t" 2120</pre> 2121</div> 2122<p>Railsã³ã³ã½ã¼ã«ãçµäºããã¸ã§ãã¬ã¼ã¿ã追å ãã<code>bcrypt</code> gemãåæ ããããã«ä»¥ä¸ã®ã³ãã³ããå®è¡ãã¦Railsãµã¼ãã¼ãåèµ·åãã¾ãï¼BCryptã¯èªè¨¼ç¨ã®ãã¹ã¯ã¼ããå®å ¨ã«ããã·ã¥åããã®ã«ä½¿ããã¾ãï¼ã</p> 2123<div class="code_container"> 2124<pre class="highlight"> 2125<span class="gp">$</span><span class="w"> </span>bin/rails server 2126</pre> 2127</div> 2128<p>ãã©ã¦ã¶ã§Railsã¢ããªãéãã¨ãã©ã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ãã¦ãã¦ã¼ã¶ã¼åã¨ãã¹ã¯ã¼ãã®å ¥åãæ±ããããããã«ãªãã¾ãã</p> 2129<p><code>http://localhost:3000/products/new</code>ããã©ã¦ã¶ã§éãã¦ã<code>User</code>ã¬ã³ã¼ãã®ä½ææã«å ¥åããã¡ã¼ã«ã¢ãã¬ã¹ã¨ãã¹ã¯ã¼ããå ¥åãã¦ã¿ã¾ãããã</p> 2130<p>æ£ããã¦ã¼ã¶ã¼åã¨ãã¹ã¯ã¼ããå ¥åããã¨ãã¼ã¸ã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ããã¾ãããã©ã¦ã¶ã¯ä»å¾ã®ãªã¯ã¨ã¹ãã«åãã¦ããããcredentialï¼èªè¨¼æ å ±ï¼ãä¿åããã®ã§ããã¼ã¸ãã¥ã¼ãç§»åãããã³ã«å ¥åããå¿ è¦ã¯ããã¾ããã</p> 2131<h4 id="ãã°ã¢ã¦ãæ©è½ã追å ãã"><a class="anchorlink" href="#%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">11.1 ãã°ã¢ã¦ãæ©è½ã追å ãã</a></h4> 2132<p>ã¢ããªã±ã¼ã·ã§ã³ãããã°ã¢ã¦ãããããã®ãã¿ã³ã<code>app/views/layouts/application.html.erb</code>ã¬ã¤ã¢ã¦ããã¡ã¤ã«ã®åé ã«è¿½å ãã¾ãããããã®ã¬ã¤ã¢ã¦ãã«ã¯ããããã¼ãããã¿ã¼ãªã©ããã¹ã¦ã®ãã¼ã¸ã§ä½¿ãHTMLãé ç½®ãã¾ãã</p> 2133<p>以ä¸ã®ããã«ã<code><body></code>ã¿ã°å ã«ãã¼ã ã¸ã®ãªã³ã¯ã¨ãã°ã¢ã¦ããã¿ã³ãå«ãå°ããª<code><nav></code>ã»ã¯ã·ã§ã³ã追å ããRubyã®<code>yield</code>ã¡ã½ããã<code><main></code>ã¿ã°ã§å²ã¿ã¾ãã</p> 2134<div class="code_container"> 2135<pre class="highlight"> 2136<span class="c"><%# app/views/layouts/application.html.erb %></span> 2137<span class="cp"><!DOCTYPE html></span> 2138<span class="nt"><html></span> 2139 <span class="c"><%# ï¼çç¥ï¼ %></span> 2140 <span class="nt"><body></span> 2141 <span class="nt"><nav></span> 2142 <span class="cp"><%=</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">%></span>
2143 <span class="cp"><%=</span> <span class="n">button_to</span> <span class="s2">"Log out"</span><span class="p">,</span> <span class="n">session_path</span><span class="p">,</span> <span class="ss">method: :delete</span> <span class="k">if</span> <span class="n">authenticated?</span> <span class="cp">%></span> 2144 <span class="nt"></nav></span> 2145 2146 <span class="nt"><main></span> 2147 <span class="cp"><%=</span> <span class="k">yield</span> <span class="cp">%></span> 2148 <span class="nt"></main></span> 2149 <span class="nt"></body></span> 2150<span class="nt"></html></span> 2151</pre> 2152</div> 2153<p>ã¦ã¼ã¶ã¼ãèªè¨¼æ¸ã¿ã®å ´åã«ã®ã¿ãLog outãã¿ã³ã表示ããã¾ãã 2154Log outãã¿ã³ãã¯ãªãã¯ããã¨ã<code>session_path</code>ã«<code>DELETE</code>ãªã¯ã¨ã¹ããéä¿¡ããã¦ãã¦ã¼ã¶ã¼ããã°ã¢ã¦ããã¾ãã</p> 2155<h4 id="èªè¨¼ãªãã®ã¢ã¯ã»ã¹ã許å¯ãã"><a class="anchorlink" href="#%E8%AA%8D%E8%A8%BC%E3%81%AA%E3%81%97%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%82%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B">11.2 èªè¨¼ãªãã®ã¢ã¯ã»ã¹ã許å¯ãã</a></h4> 2156<p>ãã ããã¹ãã¢ã®è£½åindexãã¼ã¸ã¨showãã¼ã¸ã¯èª°ã§ãã¢ã¯ã»ã¹ã§ããããã«ãã¦ããå¿ è¦ãããã¾ããRailsã®èªè¨¼ã¸ã§ãã¬ã¼ã¿ã¯ãããã©ã«ãã§ã¯ãã¹ã¦ã®ãã¼ã¸ã¸ã®ã¢ã¯ã»ã¹ãèªè¨¼æ¸ã¿ã¦ã¼ã¶ã¼ã®ã¿ã«å¶éãã¾ãã</p> 2157<p>ã²ã¹ãã製åã表示ã§ããããã«ããã«ã¯ãã³ã³ããã¼ã©ã§ä»¥ä¸ã®ããã«èªè¨¼ãªãã®ã¢ã¯ã»ã¹ã許å¯ãã¾ãã</p> 2158<div class="code_container"> 2159<pre class="highlight"> 2160<span class="c1"># app/controllers/products_controller.rb</span> 2161<span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 2162 <span class="n">allow_unauthenticated_access</span> <span class="ss">only: </span><span class="sx">%i[ index show ]</span> 2163 <span class="c1"># ï¼çç¥ï¼</span> 2164<span class="k">end</span> 2165</pre> 2166</div> 2167<p>ãã°ã¢ã¦ããã¦ããåã³è£½åã®indexãã¼ã¸ã¨showãã¼ã¸ã«ã¢ã¯ã»ã¹ããèªè¨¼ãªãã§ã¢ã¯ã»ã¹ã§ãããã©ããã確èªãã¦ã¿ã¦ãã ããã</p> 2168<h4 id="èªè¨¼æ¸ã¿ã¦ã¼ã¶ã¼ã«ã ããªã³ã¯ã表示ãã"><a class="anchorlink" href="#%E8%AA%8D%E8%A8%BC%E6%B8%88%E3%81%BF%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E3%81%A0%E3%81%91%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B">11.3 èªè¨¼æ¸ã¿ã¦ã¼ã¶ã¼ã«ã ããªã³ã¯ã表示ãã</a></h4> 2169<p>製åã使ãã¦ããã®ã¯ãã°ã¤ã³æ¸ã¿ã®ã¦ã¼ã¶ã¼ã ãã«ãã¦ããããã®ã§ã<code>app/views/products/index.html.erb</code>ãã¥ã¼ã®<code>link_to</code>è¡ã以ä¸ã®ããã«å¤æ´ãã¦ãã¦ã¼ã¶ã¼ãèªè¨¼æ¸ã¿ã®å ´åã«ã®ã¿New productãªã³ã¯ã表示ããããã«ãã¾ãããã</p> 2170<div class="code_container"> 2171<pre class="highlight"> 2172<span class="c"><%# app/views/products/index.html.erb %></span> 2173<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"New product"</span><span class="p">,</span> <span class="n">new_product_path</span> <span class="k">if</span> <span class="n">authenticated?</span> <span class="cp">%></span> 2174</pre> 2175</div> 2176<p>Log outãã¿ã³ãã¯ãªãã¯ããã¨ãindexãã¼ã¸ã®New productãªã³ã¯ãé表示ã«ãªãã¾ãã<code>http://localhost:3000/session/new</code>ããã©ã¦ã¶ã§éãã¦ãã°ã¤ã³ããã¨ãindexãã¼ã¸ã«New productãªã³ã¯ã表示ããã¾ãã</p> 2177<p>ãªãã·ã§ã³ã¨ãã¦ãå ã»ã©ã®<code>app/views/layouts/application.html.erb</code>ã¬ã¤ã¢ã¦ãã®<code><nav></code>ã»ã¯ã·ã§ã³ã«ä»¥ä¸ã®ã«ã¼ãã£ã³ã°ã¸ã®ãªã³ã¯ã追å ãã¦ãèªè¨¼ããã¦ããªãå ´åã¯Loginãªã³ã¯ã表示ããããã«ãã¦ãããã§ãããã</p> 2178<div class="code_container"> 2179<pre class="highlight"> 2180<span class="c"><%# app/views/layouts/application.html.erb %></span> 2181<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Login"</span><span class="p">,</span> <span class="n">new_session_path</span> <span class="k">unless</span> <span class="n">authenticated?</span> <span class="cp">%></span> 2182</pre> 2183</div> 2184<p>ã¾ãã<code>app/views/products/show.html.erb</code>ãã¥ã¼ã®Editãªã³ã¯ã¨Deleteãªã³ã¯ã以ä¸ã®ããã«æ´æ°ãã¦ãèªè¨¼æ¸ã¿ã®å ´åã«ã®ã¿Editãªã³ã¯ã¨Deleteãªã³ã¯ã表示ããããã«ãã¦ãããã§ãããã</p> 2185<div class="code_container"> 2186<pre class="highlight"> 2187<span class="c"><%# app/views/products/show.html.erb %></span> 2188<span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 2189 2190<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Back"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span> 2191<span class="cp"><%</span> <span class="k">if</span> <span class="n">authenticated?</span> <span class="cp">%></span> 2192 <span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Edit"</span><span class="p">,</span> <span class="n">edit_product_path</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> 2193 <span class="cp"><%=</span> <span class="n">button_to</span> <span class="s2">"Delete"</span><span class="p">,</span> <span class="vi">@product</span><span class="p">,</span> <span class="ss">method: :delete</span><span class="p">,</span> <span class="ss">data: </span><span class="p">{</span> <span class="ss">turbo_confirm: </span><span class="s2">"Are you sure?"</span> <span class="p">}</span> <span class="cp">%></span> 2194<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2195</pre> 2196</div> 2197<h3 id="製åããã£ãã·ã¥ã«ä¹ãã"><a class="anchorlink" href="#%E8%A3%BD%E5%93%81%E3%82%92%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AB%E4%B9%97%E3%81%9B%E3%82%8B">12 製åããã£ãã·ã¥ã«ä¹ãã</a></h3> 2198<p>ãã¼ã¸ã®ç¹å®ã®é¨åããã£ãã·ã¥ããã¨ãããã©ã¼ãã³ã¹ãåä¸ããå ´åãããã¾ãã 2199Railsã¯ããã¼ã¿ãã¼ã¹ä¸ã«æ§ç¯ããããã£ãã·ã¥ã¹ãã¢ã§ããSolid Cacheãããã©ã«ãã§çµã¿è¾¼ããã¨ã§ããã®ããã»ã¹ãç°¡ç´ åãã¦ãã¾ãã</p> 2200<p><code>cache</code>ã¡ã½ããã使ãã¨ãHTMLããã£ãã·ã¥ã«ä¿åã§ãã¾ãã<code>app/views/products/show.html.erb</code>ã®<code><h1></code>è¦åºãã以ä¸ã®ããã«å²ãã§ããã£ãã·ã¥ãæå¹ã«ãã¦ã¿ã¾ãããã</p> 2201<div class="code_container"> 2202<pre class="highlight"> 2203<span class="c"><%# app/views/products/show.html.erb %></span> 2204<span class="cp"><%</span> <span class="n">
2204cache</span> <span class="vi">@product</span> <span class="k">do</span> <span class="cp">%></span> 2205 <span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 2206<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2207</pre> 2208</div> 2209<p><code>@product</code>ã<code>cache</code>ã¡ã½ããã«æ¸¡ãã¨ã製åã«åºæã®ãã£ãã·ã¥ãã¼ãçæãã¾ããActive Recordãªãã¸ã§ã¯ãã«ãã<code>cache_key</code>ã¡ã½ããã¯ã<code>"products/1"</code>ã®ãããªæååãè¿ãã¾ãããã¥ã¼ã®<code>cache</code>ãã«ãã¼ã¯ãããããã³ãã¬ã¼ããã¤ã¸ã§ã¹ãã¨çµã¿åããã¦ããã®HTMLã«åºæã®ãã¼ã使ãã¾ãã</p> 2210<p>developmentã¢ã¼ãã§ãã£ãã·ã¥ãæå¹ã«ããã«ã¯ãã¿ã¼ããã«ã§æ¬¡ã®ã³ãã³ããå®è¡ãã¾ãã</p> 2211<div class="code_container"> 2212<pre class="highlight"> 2213<span class="gp">$</span><span class="w"> </span>bin/rails dev:cache 2214</pre> 2215</div> 2216<p>製åã®<code>show</code>ã¢ã¯ã·ã§ã³ï¼<code>/products/2</code>ãªã©ï¼ã«ã¢ã¯ã»ã¹ããã¨ãRailsã®ãµã¼ãã¼ãã°ã«æ°ãããã£ãã·ã¥è¡ã表示ããã¾ãã</p> 2217<div class="code_container"> 2218<pre class="highlight"> 2219<span class="go">Read fragment views/products/show:a5a585f985894cd27c8b3d49bb81de3a/products/1-20240918154439539125 (1.6ms) 2220Write fragment views/products/show:a5a585f985894cd27c8b3d49bb81de3a/products/1-20240918154439539125 (4.0ms) 2221</span> 2222</pre> 2223</div> 2224<p>ãã£ãã·ã¥ãæå¹ã«ãã¦ãããã®ãã¼ã¸ãåãã¦éãã¨ãRailsã¯ãã£ãã·ã¥ãã¼ãçæãã¦ããã£ãã·ã¥ã¹ãã¢ãåå¨ãããã©ãããåãåããã¾ããããããã°ã®<code>Read fragment</code>è¡ã§ãã</p> 2225<p>ããã¯åãã¦è¡¨ç¤ºãããã¼ã¸ãã¥ã¼ãªã®ã§ãã£ãã·ã¥ã¯åå¨ãããHTMLãçæããã¦ãã£ãã·ã¥ã«æ¸ãè¾¼ã¾ãã¾ããããã¯ãã°ã®<code>Write fragment</code>è¡ã¨ãã¦ç¢ºèªã§ãã¾ãã</p> 2226<p>ãã¼ã¸ãæ´æ°ããã¨ããã°ã«<code>Write fragment</code>ãåºåãããªããªããã¨ããããã¾ãã</p> 2227<div class="code_container"> 2228<pre class="highlight"> 2229<span class="go">Read fragment views/products/show:a5a585f985894cd27c8b3d49bb81de3a/products/1-20240918154439539125 (1.3ms) 2230</span> 2231</pre> 2232</div> 2233<p>ãã£ãã·ã¥ã¨ã³ããªã¯æå¾ã®ãªã¯ã¨ã¹ãã«ãã£ã¦æ¸ãè¾¼ã¾ãããããRailsã¯2åç®ã®ãªã¯ã¨ã¹ãã§ãã£ãã·ã¥ã¨ã³ããªãè¦ã¤ãã¾ããã¾ããRailsã¯ã¬ã³ã¼ããæ´æ°ãããã¨ãã£ãã·ã¥ãã¼ã夿´ãã¦ãå¤ããã£ãã·ã¥ãã¼ã¿ã誤ã£ã¦ã¬ã³ããªã³ã°ãããªãããã«ãã¾ãã</p> 2234<p>詳ããã¯ã<a href="caching_with_rails.html">Rails ã®ãã£ãã·ã¥</a>ã¬ã¤ããåç §ãã¦ãã ããã</p> 2235<h3 id="ãã£ã¼ã«ããaction-textã§ãªããããã¹ãã«ãã"><a class="anchorlink" href="#%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92action-text%E3%81%A7%E3%83%AA%E3%83%83%E3%83%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%99%E3%82%8B">13 ãã£ã¼ã«ããAction Textã§ãªããããã¹ãã«ãã</a></h3> 2236<p>ãªããããã¹ãæ©è½ããã«ãã¡ãã£ã¢è¦ç´ ã®åãè¾¼ã¿æ©è½ã¯ãå¤ãã®ã¢ããªã±ã¼ã·ã§ã³ã§æ±ãããã¦ãã¾ããRailsã®Action Textã使ãã°ãããããæ©è½ãããã«ä½¿ããããã«ãªãã¾ãã</p> 2237<p>Action Textã®å©ç¨ãéå§ããã«ã¯ãã¾ãã¤ã³ã¹ãã¼ã©ã¼ãå®è¡ãã¾ãã</p> 2238<div class="code_container"> 2239<pre class="highlight"> 2240<span class="gp">$</span><span class="w"> </span>bin/rails action_text:install 2241<span class="gp">$</span><span class="w"> </span>bundle <span class="nb">install</span> 2242<span class="gp">$</span><span class="w"> </span>bin/rails db:migrate 2243</pre> 2244</div> 2245<p>ãã¹ã¦ã®æ°æ©è½ãèªã¿è¾¼ã¾ãã¦ãããã¨ã確èªããããã«ãRailsãµã¼ãã¼ãåèµ·åãã¾ãã</p> 2246<p>次ã«ããªããããã¹ãã®descriptionï¼èª¬æï¼ãã£ã¼ã«ãã製åã«è¿½å ãã¦ã¿ã¾ãããã</p> 2247<p>ã¾ãã<code>Product</code>ã¢ãã«ã«ä»¥ä¸ã®ã³ã¼ãã追å ãã¾ãã</p> 2248<div class="code_container"> 2249<pre class="highlight"> 2250<span class="c1"># app/models/product.rb</span> 2251<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2252 <span class="n">has_rich_text</span> <span class="ss">:description</span> 2253 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">
2253presence: </span><span class="kp">true</span> 2254<span class="k">end</span> 2255</pre> 2256</div> 2257<p>ããã§ã<code>app/views/products/_form.html.erb</code>ã®ãã©ã¼ã ã以ä¸ã®ããã«æ´æ°ãã¦ãéä¿¡ãã¿ã³ã®ä¸ã«èª¬æã®ç·¨éç¨ãªããããã¹ããã£ã¼ã«ãã追å ã§ããããã«ãªãã¾ãã</p> 2258<div class="code_container"> 2259<pre class="highlight"> 2260<span class="c"><%# app/views/products/_form.html.erb %></span> 2261<span class="cp"><%=</span> <span class="n">form_with</span> <span class="ss">model: </span><span class="n">product</span> <span class="k">do</span> <span class="o">|</span><span class="n">form</span><span class="o">|</span> <span class="cp">%></span> 2262 <span class="c"><%# ï¼çç¥ï¼ %></span> 2263 2264 <span class="nt"><div></span> 2265 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">label</span> <span class="ss">:description</span><span class="p">,</span> <span class="ss">style: </span><span class="s2">"display: block"</span> <span class="cp">%></span> 2266 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">rich_textarea</span> <span class="ss">:description</span> <span class="cp">%></span> 2267 <span class="nt"></div></span> 2268 2269 <span class="nt"><div></span> 2270 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">submit</span> <span class="cp">%></span> 2271 <span class="nt"></div></span> 2272<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2273</pre> 2274</div> 2275<p>ãã®æ°ãããã©ã¡ã¼ã¿ããã©ã¼ã ã§éä¿¡ããã«ã¯ã<code>app/controllers/products_controller.rb</code>ã³ã³ããã¼ã©å´ã§è¨±å¯ããå¿ è¦ãããã®ã§ã<code>expect</code>ã§è¨±å¯ãããã©ã¡ã¼ã¿ã以ä¸ã®ããã«æ´æ°ãã¦ã<code>description</code>ã追å ãã¾ãã</p> 2276<div class="code_container"> 2277<pre class="highlight"> 2278<span class="c1"># app/controllers/products_controller.rb</span> 2279 <span class="c1"># ä¿¡é ¼ã§ãããã©ã¡ã¼ã¿ãªã¹ãã®ã¿ã許å¯ãã</span> 2280 <span class="k">def</span> <span class="nf">product_params</span> 2281 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:description</span> <span class="p">])</span> 2282 <span class="k">end</span> 2283</pre> 2284</div> 2285<p>ããã«ãshowãã¥ã¼ï¼<code>app/views/products/show.html.erb</code>ï¼ã®<code>cache</code>ãããã¯ã以ä¸ã®ããã«æ´æ°ãã¦ã説æãã£ã¼ã«ãã表示ããå¿ è¦ãããã¾ãã</p> 2286<div class="code_container"> 2287<pre class="highlight"> 2288<span class="c"><%# app/views/products/show.html.erb%></span> 2289<span class="cp"><%</span> <span class="n">cache</span> <span class="vi">@product</span> <span class="k">do</span> <span class="cp">%></span> 2290 <span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 2291 <span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">description</span> <span class="cp">%></span> 2292<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2293</pre> 2294</div> 2295<p>ãã¥ã¼ã夿´ãããã¨ãRailsã«ãã£ã¦çæããããã£ãã·ã¥ãã¼ã夿´ãããã®ã§ããã£ãã·ã¥ããã¥ã¼ãã³ãã¬ã¼ãã®ææ°ãã¼ã¸ã§ã³ã¨åæããç¶æ ãç¶æããã¾ãã</p> 2296<p>ããã§ã¯ãæ°ãã製åã使ãã¦ãdescriptionãã£ã¼ã«ãã«å¤ªåãæä½ã®ããã¹ãã追å ãã¦ã¿ã¾ãããã製åã使ããã¨ãæ¸å¼ä»ãããã¹ããShowãã¼ã¸ã«è¡¨ç¤ºãããããã«ãªãã製åãç·¨éããã¨ããã®ãªããããã¹ããããã¹ãé åã«ä¿æãããããã«ãªãã¾ãã</p> 2297<p>詳ããã¯ã<a href="action_text_overview.html">Action Textã®æ¦è¦</a>ãåç §ãã¦ãã ããã</p> 2298<h3 id="active-storageã§ãã¡ã¤ã«ã¢ãããã¼ãæ©è½ã追å ãã"><a class="anchorlink" href="#active-storage%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">14 Active Storageã§ãã¡ã¤ã«ã¢ãããã¼ãæ©è½ã追å ãã</a></h3> 2299<p>Action Textã¯ããã¡ã¤ã«ã®ã¢ãããã¼ããæè»½ã«è¡ããActive Storageã¨ããRailsã®å¥ã®æ©è½ã®ä¸ã«æ§ç¯ããã¦ãã¾ãã</p> 2300<p>製åã®Editãã¼ã¸ãéãã¦ãé©å½ãªç»åããªããããã¹ãã¨ãã£ã¿ã«ãã©ãã°ãã¦ãããã¬ã³ã¼ããæ´æ°ãã¦ã¿ã¦ãã ãããç»åãã¢ãããã¼ãããã¦ããªããããã¹ãã¨ãã£ã¿å ã§è¡¨ç¤ºããã¦ãããã¨ããããã¾ããç´ æ´ãããã§ããï¼</p> 2301<p>Active Storageã¯ãAction Textã¨å¥ã«ç´æ¥å©ç¨ãããã¨ãå¯è½ã§ãã</p> 2302<p><code>Product</code>ã¢ãã«ã«è£½åç»åãæ·»ä»ããæ©è½ã追å ãã¦ã¿ã¾ãããã</p> 2303<div class="code_container"> 2304<pre class="highlight"> 2305<span class="c1"># app/models/product.rb</span> 2306<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2307 <span class="n">has_one_attached</span> <span class="ss">:featured_image</span> 2308 <span class="n">has_rich_text</span> <span class="ss">:description</span> 2309 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">
2309presence: </span><span class="kp">true</span> 2310<span class="k">end</span> 2311</pre> 2312</div> 2313<p>ç¶ãã¦ã<code>app/views/products/_form.html.erb</code>ãã©ã¼ã ã®Submitãã¿ã³ã®ä¸ã«ã以ä¸ã®ããã«ãã¡ã¤ã«ã¢ãããã¼ãç¨ãã£ã¼ã«ãã追å ãã¾ãã</p> 2314<div class="code_container"> 2315<pre class="highlight"> 2316<span class="c"><%# app/views/products/_form.html.erb %></span> 2317<span class="cp"><%=</span> <span class="n">form_with</span> <span class="ss">model: </span><span class="n">product</span> <span class="k">do</span> <span class="o">|</span><span class="n">form</span><span class="o">|</span> <span class="cp">%></span> 2318 <span class="c"><%# ï¼çç¥ï¼ %></span> 2319 2320 <span class="nt"><div></span> 2321 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">label</span> <span class="ss">:featured_image</span><span class="p">,</span> <span class="ss">style: </span><span class="s2">"display: block"</span> <span class="cp">%></span> 2322 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">file_field</span> <span class="ss">:featured_image</span><span class="p">,</span> <span class="ss">accept: </span><span class="s2">"image/*"</span> <span class="cp">%></span> 2323 <span class="nt"></div></span> 2324 2325 <span class="nt"><div></span> 2326 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">submit</span> <span class="cp">%></span> 2327 <span class="nt"></div></span> 2328<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2329</pre> 2330</div> 2331<p>ããã¾ã§ã¨åæ§ã«ã<code>:featured_image</code>ãè¨±å¯æ¸ã¿ãã©ã¡ã¼ã¿ã¨ãã¦<code>app/controllers/products_controller.rb</code>ã«è¿½å ãã¾ãã</p> 2332<div class="code_container"> 2333<pre class="highlight"> 2334<span class="c1"># app/controllers/products_controller.rb</span> 2335 <span class="c1"># ä¿¡é ¼ã§ãããã©ã¡ã¼ã¿ãªã¹ãã®ã¿ã許å¯ãã</span> 2336 <span class="k">def</span> <span class="nf">product_params</span> 2337 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:description</span><span class="p">,</span> <span class="ss">:featured_image</span> <span class="p">])</span> 2338 <span class="k">end</span> 2339</pre> 2340</div> 2341<p>æå¾ã«ã<code>app/views/products/show.html.erb</code>ã®åé ã«ä»¥ä¸ã®ã³ã¼ãã追å ãã¦ã製åç»åã表示ã§ããããã«ãã¾ãããã</p> 2342<div class="code_container"> 2343<pre class="highlight"> 2344<span class="c"><%# app/views/products/show.html.erb %></span> 2345<span class="cp"><%=</span> <span class="n">image_tag</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">featured_image</span> <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">featured_image</span><span class="p">.</span><span class="nf">attached?</span> <span class="cp">%></span> 2346</pre> 2347</div> 2348<p><code>http://localhost:3000/products/new</code>ããã©ã¦ã¶ã§éãã¦ãFeatured imageã®ããã¡ã¤ã«ã鏿ããã¿ã³ãã¯ãªãã¯ãã¦è£½åç»åãã¢ãããã¼ããã¦ã¿ãã¨ãä¿åå¾ã«showãã¼ã¸ã«ç»åã表示ãããããã«ãªãã¾ãã</p> 2349<p>詳ããã¯ã<a href="active_storage_overview.html">Active Storage ã®æ¦è¦</a>ãåç §ãã¦ãã ããã</p> 2350<h3 id="å½éåï¼i18nï¼"><a class="anchorlink" href="#%E5%9B%BD%E9%9A%9B%E5%8C%96%EF%BC%88i18n%EF%BC%89">15 å½éåï¼I18nï¼</a></h3> 2351<p>Railsã使ãã°ãã¢ããªãä»ã®è¨èªã«ç¿»è¨³ãããããªãã¾ãã</p> 2352<p>ãã¥ã¼ã®<code>translate</code>ãã«ãã¼ï¼ç縮形ã¯<code>t</code>ï¼ã¯ãååã§è¨³æãæ¤ç´¢ãã¦ãç¾å¨ã®ãã±ã¼ã«è¨å®ã«åãããã¹ããè¿ãã¾ãã</p> 2353<p><code>app/views/products/index.html.erb</code>ã®<code><h1></code>è¦åºãã¿ã°ã以ä¸ã®ããã«æ´æ°ãã¦ãè¦åºãã«è¨³æã使ãããããã«ãã¦ã¿ã¾ãããã</p> 2354<div class="code_container"> 2355<pre class="highlight"> 2356<span class="c"><%# app/views/products/index.html.erb %></span> 2357<span class="nt"><h1></span><span class="cp"><%=</span> <span class="n">t</span> <span class="s2">"hello"</span> <span class="cp">%></span><span class="nt"></h1></span> 2358</pre> 2359</div> 2360<p>ãã¼ã¸ãæ´æ°ããã¨ãè¦åºãããã¹ãã<code>Products</code>ãã<code>Hello world</code>ã«å¤ãã£ã¦ãããã¨ããããã¾ãããã®ããã¹ãã¯ã©ãããæ¥ãã®ã§ãããã?</p> 2361<p>ããã©ã«ãã®è¨èªã¯è±èªï¼<code>en</code>ï¼ãªã®ã§ãRailsã¯<code>config/locales/en.yml</code>ï¼ããã¯<code>rails new</code>ã§èªå使ããã¾ãï¼ãæ¢ç´¢ãããã®<code>en</code>ãã±ã¼ã«ã®ä¸ã«ãã以ä¸ã®ãã¼ï¼è¨³æãµã³ãã«ï¼ã«ããããã¾ãã</p> 2362<div class="code_container"> 2363<pre class="highlight"> 2364# config/locales/en.yml 2365en: 2366 hello: "Hello world" 2367</pre> 2368</div> 2369<p>ããã§ã¯ãæ¥æ¬èªç¨ã®æ°ãããã±ã¼ã«ãã¡ã¤ã«ã使ãã¦ã¿ã¾ããããã¨ãã£ã¿ã§<code>config/locales/ja.yml</code>ãã¡ã¤ã«ã使ãã以ä¸ã®è¨³æã追å ãã¾ãã</p> 2370<div class="code_container"> 2371<pre class="highlight"> 2372# config/locales/ja.yml 2373ja: 2374 hello: "ããã«ã¡ã¯ãä¸ç" 2375</pre> 2376</div> 2377<p>次ã«ãã©ã®ãã±ã¼ã«ãå©ç¨ããããRailsã«ä¼ããå¿ è¦ãããã¾ãã</p> 2378<p>æãæè»½ãªæ¹æ³ã¯ããã±ã¼ã«ãã©ã¡ã¼ã¿ãURLããæ¢ããã¨ã§ã
2378ã<code>app/controllers/application_controller.rb</code>ã§ä»¥ä¸ã®ã³ã¼ãã追å ãããã¨ã§ããããå®ç¾ã§ãã¾ãã</p> 2379<div class="code_container"> 2380<pre class="highlight"> 2381<span class="c1"># app/controllers/application_controller.rb</span> 2382<span class="k">class</span> <span class="nc">ApplicationController</span> <span class="o"><</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span> 2383 <span class="c1"># ï¼çç¥ï¼</span> 2384 2385 <span class="n">around_action</span> <span class="ss">:switch_locale</span> 2386 2387 <span class="k">def</span> <span class="nf">switch_locale</span><span class="p">(</span><span class="o">&</span><span class="n">action</span><span class="p">)</span> 2388 <span class="n">locale</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="ss">:locale</span><span class="p">]</span> <span class="o">||</span> <span class="no">I18n</span><span class="p">.</span><span class="nf">default_locale</span> 2389 <span class="no">I18n</span><span class="p">.</span><span class="nf">with_locale</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="o">&</span><span class="n">action</span><span class="p">)</span> 2390 <span class="k">end</span> 2391<span class="k">end</span> 2392</pre> 2393</div> 2394<p>ãã®ã³ã¼ãã¯ãã¹ã¦ã®ãªã¯ã¨ã¹ãã§å®è¡ããããã©ã¡ã¼ã¿å ã®<code>locale</code>ãæ¢ç´¢ãã¦ãè¦ã¤ãããªãå ´åã¯ããã©ã«ãã®ãã±ã¼ã«ï¼é常ã¯<code>en</code>ï¼ã«ãã©ã¼ã«ããã¯ãã¾ããããã«åºã¥ãã¦ãªã¯ã¨ã¹ãã®ãã±ã¼ã«ãè¨å®ããå®äºå¾ã«ãªã»ãããã¾ãã</p> 2395<ul> 2396<li> 2397<code>http://localhost:3000/products?locale=en</code>ããã©ã¦ã¶ã§éãã¨ãè±æã表示ããã¾ãã</li> 2398<li> 2399<code>http://localhost:3000/products?locale=ja</code>ããã©ã¦ã¶ã§éãã¨ãæ¥æ¬èªã®è¨³æã表示ããã¾ãã</li> 2400<li>ãã±ã¼ã«ãæå®ããªã<code>http://localhost:3000/products</code>ããã©ã¦ã¶ã§éãã¨ãè±èªã«ãã©ã¼ã«ããã¯ãã¾ãã</li> 2401</ul> 2402<p>次ã¯ãindexãã¼ã¸ã®<code><h1></code>
2402è¦åºãã®ãµã³ãã«è¨³æããå®éã®è¨³æã«å·®ãæ¿ãã¦ã¿ã¾ãããã<code>app/views/products/index.html.erb</code>ã®è¦åºãã以ä¸ã®ããã«æ´æ°ãã¾ã</p> 2403<div class="code_container"> 2404<pre class="highlight"> 2405<span class="c"><%# app/views/products/index.html.erb %></span> 2406<span class="nt"><h1></span><span class="cp"><%=</span> <span class="n">t</span> <span class="s2">".title"</span> <span class="cp">%></span><span class="nt"></h1></span> 2407</pre> 2408</div> 2409<div class="info"><p><code>title</code>ã®ç´åã®<code>.</code>ã¯ããã±ã¼ã«ã<strong>ç¸å¯¾æ¤ç´¢</strong>ãããã¨ã表ãæç¤ºã§ããç¸å¯¾æ¤ç´¢ã§ã¯ããã¼ã«ã³ã³ããã¼ã©åã¨ã¢ã¯ã·ã§ã³åãèªåçã«å«ã¾ãããããã³ã³ããã¼ã©åãã¢ã¯ã·ã§ã³åãæ¯åå ¥åããã«æ¸ã¿ã¾ããè±èªãã±ã¼ã«ã§<code>.title</code>ãæå®ããã¨ãå®éã«ã¯<code>en.products.index.title</code>ãæ¤ç´¢ããã¾ãã</p></div> 2410<p><code>config/locales/en.yml</code>ã§ã¯ã以ä¸ã®ããã«<code>products</code>ã¨<code>index</code>ã追å ãããã®ä¸ã«<code>title</code>ãã¼ã追å ãããã¨ã§ã<code>ã³ã³ããã¼ã©å.ãã¥ã¼å.訳æå</code>ã¨ä¸è´ããããã«ãã¾ãã</p> 2411<div class="code_container"> 2412<pre class="highlight"> 2413# config/locales/en.yml 2414en: 2415 hello: "Hello world" 2416 products: 2417 index: 2418 title: "Products" 2419</pre> 2420</div> 2421<p>æ¥æ¬èªã®ãã±ã¼ã«ãã¡ã¤ã«ã«ãã以ä¸ã®ããã«è±èªãã±ã¼ã«ãã¡ã¤ã«ã¨å¯¾å¿ããå½¢ã§è¨³æã追å ãã¾ãã</p> 2422<div class="code_container"> 2423<pre class="highlight"> 2424# config/locales/ja.yml 2425ja: 2426 hello: "ããã«ã¡ã¯ãä¸ç" 2427 products: 2428 index: 2429 title: "製å" 2430</pre> 2431</div> 2432<p>ããã§ã<code>http://localhost:3000/?locale=en</code>ã§è±èªãã±ã¼ã«ã表示ããã¨ãProductsãã表示ããã<code>http://localhost:3000/?locale=ja</code>ã§æ¥æ¬èªãã±ã¼ã«ã表示ããã¨ã製åãã表示ãããããã«ãªãã¾ãã</p> 2433<p>詳ããã¯<a href="i18n.html">Rails å½éåï¼I18nï¼API</a>ã¬ã¤ããåç §ãã¦ãã ããã</p> 2434<h3 id="action-mailerã¨ã¡ã¼ã«éç¥"><a class="anchorlink" href="#action-mailer%E3%81%A8%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5">16 Action Mailerã¨ã¡ã¼ã«éç¥</a></h3> 2435<p>製åã®å¨åº«ã復活ããã¨ãã«éç¥ãåãåãããã®é»åã¡ã¼ã«ãç»é²ããæ©è½ã¯ãeã³ãã¼ã¹ã¹ãã¢ã§ãã使ãããæ©è½ã§ããRailsã®åºæ¬ã«ã¤ãã¦ã²ã¨ã¨ãã確èªããã®ã§ãä»åº¦ã¯ãã®æ©è½ãã¹ãã¢ã«è¿½å ãã¦ã¿ã¾ãããã</p> 2436<h4 id="åºæ¬çãªå¨åº«ãã©ããã³ã°æ©è½"><a class="anchorlink" href="#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E5%9C%A8%E5%BA%AB%E3%83%88%E3%83%A9%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E6%A9%9F%E8%83%BD">16.1 åºæ¬çãªå¨åº«ãã©ããã³ã°æ©è½</a></h4> 2437<p>ã¾ããProductã¢ãã«ã«<code>inventory_count</code>ï¼å¨åº«æ°ï¼ã追å ãã¦ãå¨åº«æ°ããã©ããã³ã°ã§ããããã«ãã¾ãããã以ä¸ã®ã³ãã³ããå®è¡ãã¦ãã¤ã°ã¬ã¼ã·ã§ã³ãçæãã¾ãã</p> 2438<div class="code_container"> 2439<pre class="highlight"> 2440<span class="gp">$</span><span class="w"> </span>bin/rails generate migration AddInventoryCountToProducts inventory_count:integer 2441</pre> 2442</div> 2443<div class="note"><p>Railsã¯ã<code>AddInventoryCountToProducts</code>ã<code>products</code>ãã¼ãã«ã対象ã¨ãã¦ããã¨æ¨æ¸¬ãã¾ããããã¯ãååã<code>add_<ã«ã©ã å>_to_<ãã¼ãã«å></code>ã«ã¼ã«ã«ä¸è´ããããã§ãããã®ãã¿ã¼ã³ã«ãããã¸ã§ãã¬ã¼ã¿ã§ <code>add_column :products, ...</code>ãäºåã«å ¥åãããã®ã§ãå¾ã¯ã«ã©ã ã®è©³ç´°ãå ¥åããã ãã§æ¸ã¿ã¾ããå½åè¦åã«ã¤ãã¦è©³ããã¯ã<code>bin/rails generate migration --help</code>ã³ãã³ããå®è¡ãã¦ãã ããã</p></div> 2444<p>ããã§ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ãçæããã¾ãããã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ãéãã¦ã<code>inventory_count</code>ãæ±ºãã¦<code>nil</code>ã«ãªããªãããã«ããããã«ãããã©ã«ãå¤ã¨ãã¦<code>0</code>ã追å ãã¾ãã</p> 2445<div class="code_container"> 2446<pre class="highlight"> 2447<span class="c1"># db/migrate/<ã¿ã¤ã ã¹ã¿ã³ã>_add_inventory_count_to_products.rb</span> 2448<span class="k">class</span> <span class="nc">AddInventoryCountToProducts</span> <span class="o"><</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Migration</span><span class="p">[</span><span class="mf">8.1</span><span class="p">]</span> 2449 <span class="k">def</span> <span class="nf">change</span> 2450 <span class="n">add_column</span> <span class="ss">:products</span><span class="p">,</span> <span class="ss">:inventory_count</span><span class="p">,</span> <span class="ss">:integer</span><span class="p">,</span> <span class="ss">default: </span><span class="mi">0</span> 2451 <span class="k">end</span> 2452<span class="k">end</span> 2453</pre> 2454</div> 2455<p>ç¶ãã¦ä»¥ä¸ã®ã³ãã³ãã§ãã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã¾ãã</p> 2456<div class="code_container"> 2457<pre class="highlight"> 2458<span class="gp">$</span><span class="w"> </span>bin/rails db:migrate 2459</pre> 2460</div> 2461<p>製åã®<code>app/views/products/_form.html.erb</code>ãã©ã¼ã ã«ãã以ä¸ã®ããã«å¨åº«æ°ã®ãã£ã¼ã«ãã追å ããå¿ è¦ãããã¾ãã</p> 2462<div class="code_container"> 2463<pre class="highlight"> 2464<span class="c"><%# app/views/products/_form.html.erb %></span> 2465<span class="cp"><%=</span> <span class="n">form_with</span> <span class="ss">model: </span><span class="n">product</span> <span class="k">do</span> <span class="o">|</span><span class="n">form</span><span class="o">|</span> <span class="cp">%></span> 2466 <span class="c"><%# ï¼çç¥ï¼ %></span> 2467 2468 <span class="nt"><div></span> 2469 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">label</span> <span class="ss">:inventory_count</span><span class="p">,</span> <span class="ss">style: </span><span class="s2">"display: block"</span> <span class="cp">%></span> 2470 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">number_field</span> <span class="ss">:inventory_count</span> <span class="cp">%></span> 2471 <span class="nt"></div></span> 2472 2473 <span class="nt"><div></span> 2474 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">submit</span> <span class="cp">%></span> 2475 <span class="nt"></div></span> 2476<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2477</pre> 2478</div> 2479<p><code>app/controllers/products_controller.rb</code>ã³ã³ããã¼ã©ã§ãã<code>expect</code>ã§è¨±å¯ãããã©ã¡ã¼ã¿ã«<code>:inventory_count</code>ã追å ããå¿ è¦ãããã¾ãã</p> 2480<div class="code_container"> 2481<pre class="highlight"> 2482<span class="c1"># app/controllers/products_controller.rb</span> 2483 <span class="k">def</span> <span class="nf">product_params</span>
2484 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">product: </span><span class="p">[</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:description</span><span class="p">,</span> <span class="ss">:featured_image</span><span class="p">,</span> <span class="ss">:inventory_count</span> <span class="p">])</span> 2485 <span class="k">end</span> 2486</pre> 2487</div> 2488<p>å¨åº«æ°ã決ãã¦è² ã®æ°ã«ãªããªãããã«ãã¦ããã¨ä¾¿å©ãªã®ã§ã<code>app/models/product.rb</code>ã¢ãã«ã«ãã®ããã®ããªãã¼ã·ã§ã³ã追å ãã¾ãã</p> 2489<div class="code_container"> 2490<pre class="highlight"> 2491<span class="c1"># app/models/product.rb</span> 2492<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2493 <span class="n">has_one_attached</span> <span class="ss">:featured_image</span> 2494 <span class="n">has_rich_text</span> <span class="ss">:description</span> 2495 2496 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">presence: </span><span class="kp">true</span> 2497 <span class="n">validates</span> <span class="ss">:inventory_count</span><span class="p">,</span> <span class="ss">numericality: </span><span class="p">{</span> <span class="ss">greater_than_or_equal_to: </span><span class="mi">0</span> <span class="p">}</span> 2498<span class="k">end</span> 2499</pre> 2500</div> 2501<p>以ä¸ã®å¤æ´ã«ãããã¹ãã¢å ã®è£½åã®å¨åº«æ°ãæ´æ°ã§ããããã«ãªãã¾ããã</p> 2502<h4 id="éç¥ã®è³¼èªè ã製åã«è¿½å ãã"><a class="anchorlink" href="#%E9%80%9A%E7%9F%A5%E3%81%AE%E8%B3%BC%E8%AA%AD%E8%80%85%E3%82%92%E8%A3%BD%E5%93%81%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">16.2 éç¥ã®è³¼èªè ã製åã«è¿½å ãã</a></h4> 2503<p>ååã®å¨åº«ã復活ãããã¨ãã¦ã¼ã¶ã¼ã«éç¥ããã«ã¯ãå¨åº«æ å ±ã®è³¼èªè ï¼subscriberï¼ããã©ããã³ã°ããæ©è½ãå¿ è¦ã§ãã</p> 2504<p>è³¼èªå¸æè ã®ã¡ã¼ã«ã¢ãã¬ã¹ãä¿åãã¦åå¥ã®ååã«é¢é£ä»ããããã®<code>Subscriber</code>ã¨ããã¢ãã«ãçæãã¾ãããã</p> 2505<div class="note"><p>ããã§ã¯<code>email</code>ãã£ã¼ã«ãã«åãæå®ãã¦ãã¾ããããRailsã®ãã¤ã°ã¬ã¼ã·ã§ã³ã§åãæå®ããã¦ããªãå ´åãèªåçã«<code>string</code>åãããã©ã«ãã«ãªããã¨ãå©ç¨ãã¦ãã¾ãã</p></div> 2506<div class="code_container"> 2507<pre class="highlight"> 2508<span class="gp">$</span><span class="w"> </span>bin/rails generate model Subscriber product:belongs_to email 2509</pre> 2510</div> 2511<p>ä¸ã®ã³ãã³ãã§<code>product:belongs_to</code>ãªãã·ã§ã³ãæå®ãããã¨ã§ãè³¼èªè ã¨è£½åã<strong>1対å¤</strong>ãªã¬ã¼ã·ã§ã³ãæã¤ãã¨ã表ã<code>belongs_to :product</code>ã¨ãã宣è¨ã<code>Subscriber</code>ã¢ãã«ã«å«ã¾ããããã«ãªãã¾ããã¤ã¾ãã<code>Subscriber</code>ã¢ãã«ã®ã¤ã³ã¹ã¿ã³ã¹ã¯1ã¤ã®<code>Product</code>ã¤ã³ã¹ã¿ã³ã¹ã«ãå±ããï¼belongs toï¼ãã¨ãããã¨ã§ãã</p> 2512<p>次ã«ãçæããããã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ï¼<code>db/migrate/<ã¿ã¤ã ã¹ã¿ã³ã>_create_subscribers.rb</code>ï¼ãã¨ãã£ã¿ã§éãã¾ãã</p> 2513<div class="code_container"> 2514<pre class="highlight"> 2515<span class="c1"># db/migrate/<ã¿ã¤ã ã¹ã¿ã³ã>_create_subscribers.rb</span> 2516<span class="k">class</span> <span class="nc">CreateSubscribers</span> <span class="o"><</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Migration</span><span class="p">[</span><span class="mf">8.1</span><span class="p">]</span> 2517 <span class="k">def</span> <span class="nf">change</span> 2518 <span class="n">create_table</span> <span class="ss">:subscribers</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span> 2519 <span class="n">t</span><span class="p">.</span><span class="nf">belongs_to</span> <span class="ss">:product</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">
2519false</span><span class="p">,</span> <span class="ss">foreign_key: </span><span class="kp">true</span> 2520 <span class="n">t</span><span class="p">.</span><span class="nf">string</span> <span class="ss">:email</span> 2521 <span class="n">t</span><span class="p">.</span><span class="nf">timestamps</span> 2522 <span class="k">end</span> 2523 <span class="k">end</span> 2524<span class="k">end</span> 2525</pre> 2526</div> 2527<p>ãã®ãã¤ã°ã¬ã¼ã·ã§ã³ã¯ã<code>Product</code>ã®ãã¤ã°ã¬ã¼ã·ã§ã³ã¨é常ã«ä¼¼ã¦ãã¾ããä¸»ãªæ°ããç¹ã¯<code>belongs_to</code>ãå«ã¾ãã¦ãããã¨ã§ãããã«ãã<code>product_id</code>ã¨ããå¤é¨ãã¼ã«ã©ã ã追å ããã¾ãã</p> 2528<p>ç¶ãã¦æ°ãããã¤ã°ã¬ã¼ã·ã§ã³ãå®è¡ãã¾ãã</p> 2529<div class="code_container"> 2530<pre class="highlight"> 2531<span class="gp">$</span><span class="w"> </span>bin/rails db:migrate 2532</pre> 2533</div> 2534<p>ãã ãã1ã¤ã®è£½åã«è³¼èªè ãè¤æ°åå¨ããå¯è½æ§ãããããã<code>Product</code>ã¢ãã«ã«ã<code>has_many :subscribers, dependent: :destroy</code>ãæåã§è¿½å ãããã¨ã§ã2ã¤ã®ã¢ãã«å士ã®é¢é£ä»ãã®æ®ãã®é¨åãæå®ãã¾ããããã«ããã2ã¤ã®ãã¼ã¿ãã¼ã¹ãã¼ãã«éã®ã¯ã¨ãªãjoinï¼çµåï¼ããæ¹æ³ã Railsã§èªèããã¾ãã</p> 2535<div class="code_container"> 2536<pre class="highlight"> 2537<span class="c1"># app/models/product.rb</span> 2538<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2539 <span class="n">has_many</span> <span class="ss">:subscribers</span><span class="p">,</span> <span class="ss">dependent: :destroy</span> 2540 <span class="n">has_one_attached</span> <span class="ss">:featured_image</span> 2541 <span class="n">has_rich_text</span> <span class="ss">:description</span> 2542 2543 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">presence: </span><span class="kp">true</span> 2544 <span class="n">validates</span> <span class="ss">:inventory_count</span><span class="p">,</span> <span class="ss">numericality: </span><span class="p">{</span> <span class="ss">greater_than_or_equal_to: </span><span class="mi">0</span> <span class="p">}</span> 2545<span class="k">end</span> 2546</pre> 2547</div> 2548<p>次ã¯ãè³¼èªè ã使ããããã®ã³ã³ããã¼ã©ãå¿ è¦ã§ãã<code>app/controllers/subscribers_controller.rb</code>ã³ã³ããã¼ã©ã以ä¸ã®å 容ã§ä½æãã¾ãããã</p> 2549<div class="code_container"> 2550<pre class="highlight"> 2551<span class="c1"># app/controllers/subscribers_controller.rb</span> 2552<span class="k">class</span> <span class="nc">SubscribersController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 2553 <span class="n">allow_unauthenticated_access</span> 2554 <span class="n">before_action</span> <span class="ss">:set_product</span> 2555 2556 <span class="k">def</span> <span class="nf">create</span> 2557 <span class="vi">@product</span><span class="p">.</span><span class="nf">subscribers</span><span class="p">.</span><span class="nf">where</span><span class="p">(</span><span class="n">subscriber_params</span><span class="p">).</span><span class="nf">first_or_create</span> 2558 <span class="n">redirect_to</span> <span class="vi">@product</span><span class="p">,</span> <span class="ss">notice: </span><span class="s2">"You are now subscribed."</span> 2559 <span class="k">end</span> 2560 2561 <span class="kp">private</span> 2562 2563 <span class="k">def</span> <span class="nf">set_product</span> 2564 <span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:product_id</span><span class="p">])</span> 2565 <span class="k">end</span> 2566 2567 <span class="k">def</span> <span class="nf">subscriber_params</span> 2568 <span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">
2568subscriber: </span><span class="p">[</span> <span class="ss">:email</span> <span class="p">])</span> 2569 <span class="k">end</span> 2570<span class="k">end</span> 2571</pre> 2572</div> 2573<p><code>redirect_to</code>ã¡ã½ããã®<code>notice:</code>弿°ã«ã¯ãè³¼èªãå®äºãããã¨ãç¥ãããflashã¡ãã»ã¼ã¸ãæå®ãã¦ãã¾ãã</p> 2574<p><a href="https://api.rubyonrails.org/v8.1/classes/ActionDispatch/Flash.html">flash</a>ã¯ãã³ã³ããã¼ã©ã®ã¢ã¯ã·ã§ã³éã§ä¸æçãªãã¼ã¿ãæ¸¡ãææ®µãæä¾ãã¾ããflashã«è¨å®ãããã¼ã¿ã¯æ¬¡ã®ã¢ã¯ã·ã§ã³ã§æå¹ã«ãªãããã®å¾æ¶å»ããã¾ããflashã¯é常ãã³ã³ããã¼ã©ã®ã¢ã¯ã·ã§ã³ã§ã¡ãã»ã¼ã¸ï¼éç¥ãã¢ã©ã¼ããªã©ï¼ãè¨å®ãããã®å¾ãã¦ã¼ã¶ã¼ã«ã¡ãã»ã¼ã¸ã表示ããã¢ã¯ã·ã§ã³ã«ãªãã¤ã¬ã¯ãããããã«ä½¿ããã¾ãã</p> 2575<p>ãã®flashã¡ãã»ã¼ã¸ã表示ããã«ã¯ã<code>app/views/layouts/application.html.erb</code>ã¬ã¤ã¢ã¦ãã®<code><body></code>ã¿ã°ã§ä»¥ä¸ã®ããã«éç¥ã追å ãã¾ãã</p> 2576<div class="code_container"> 2577<pre class="highlight"> 2578<span class="c"><%# app/views/layouts/application.html.erb %></span> 2579<span class="nt"><html></span> 2580 <span class="c"><%# ï¼çç¥ï¼ %></span> 2581 <span class="nt"><body></span> 2582 <span class="nt"><div</span> <span class="na">class=</span><span class="s">"notice"</span><span class="nt">></span><span class="cp"><%=</span> <span class="n">flash</span><span class="p">[</span><span class="ss">:notice</span><span class="p">]</span> <span class="cp">%></span><span class="nt"></div></span> 2583 <span class="nt"><div</span> <span class="na">class=</span><span class="s">"alert"</span><span class="nt">></span><span class="cp"><%=</span> <span class="n">flash</span><span class="p">[</span><span class="ss">:alert</span><span class="p">]</span> <span class="cp">%></span><span class="nt"></div></span> 2584 <span class="c"><%# ï¼çç¥ï¼ %></span> 2585 <span class="nt"></body></span> 2586<span class="nt"></html></span> 2587</pre> 2588</div> 2589<p>flashã«ã¤ãã¦è©³ããã¯ã<a href="action_controller_overview.html#flash">Action Controllerã¬ã¤ã</a>ãåç §ãã¦ãã ããã</p> 2590<p>ã¦ã¼ã¶ã¼ãç¹å®ã®è£½åãæå®ãã¦éç¥ãè³¼èªã§ããããã«ããããã<code>Subscriber</code>ãã©ã®<code>Product</code>ã«å±ãã¦ãããããã¹ãããã«ã¼ãã£ã³ã°ã§æå®ãã¾ãããã</p> 2591<p><code>config/routes.rb</code>ãã¡ã¤ã«ã®<code>resources :products</code>ã以ä¸ã®ããã«å¤æ´ãã¾ãã</p> 2592<div class="code_container"> 2593<pre class="highlight"> 2594<span class="c1"># config/routes.rb</span> 2595<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 2596 <span class="c1"># ï¼çç¥ï¼</span> 2597 <span class="n">resources</span> <span class="ss">:products</span> <span class="k">do</span> 2598 <span class="n">resources</span> <span class="ss">:subscribers</span><span class="p">,</span> <span class="ss">only: </span><span class="p">[</span> <span class="ss">:create</span> <span class="p">]</span> 2599 <span class="k">end</span> 2600<span class="k">end</span> 2601</pre> 2602</div> 2603<p>製åã®Showãã¼ã¸ã«å¨åº«æ°ã表示ãã¦ãå¨åº«ããããã©ããããã§ãã¯ã§ããããã«ãã¾ããããå¨åº«ããªãå ´åã¯ãå¨åº«åãã®ã¡ãã»ã¼ã¸ã¨è³¼èªç¨ã®ãã©ã¼ã ã表示ãã¦ãå¨åº«ã復活ããã¨ãã«ã¦ã¼ã¶ã¼ãéç¥ãã¡ã¼ã«ã§åãåããããã«ãã¾ãã</p> 2604<p>å¨åº«è¡¨ç¤ºç¨ã®<code>app/views/products/_inventory.html.erb</code>ãã¼ã·ã£ã«ã以ä¸ã®å 容ã§ä½æãã¾ãã</p> 2605<div class="code_container"> 2606<pre class="highlight"> 2607<span class="c"><%# app/views/products/_inventory.html.erb %></span> 2608<span class="cp"><%</span> <span class="k">if</span> <span class="n">product</span><span class="p">.</span><span class="nf">inventory_count</span><span class="p">.</span><span class="nf">positive?</span> <span class="cp">%></span> 2609 <span class="nt"><p></span><span class="cp"><%=</span> <span class="n">product</span><span class="p">.</span><span class="nf">inventory_count</span> <span class="cp">%></span> in stock<span class="nt"></p></span> 2610<span class="cp"><%</span> <span class="k">else</span> <span class="cp">%></span> 2611 <span class="nt"><p></span>Out of stock<span class="nt"></p></span> 2612 <span class="nt"><p></span>Email me when available.<span class="nt"></p></span> 2613 2614 <span class="cp"><%=</span> <span class="n">form_with</span> <span class="ss">model: </span><span class="p">[</span><span class="n">product</span><span class="p">,</span> <span class="no">Subscriber</span><span class="p">.</span><span class="nf">new</span><span class="p">]</span> <span class="k">do</span> <span class="o">|</span><span class="n">form</span><span class="o">|</span> <span class="cp">%></span> 2615 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">email_field</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">placeholder: </span><span class="s2">"[email protected]"</span><span class="p">,</span> <span class="ss">required: </span><span class="kp">true</span> <span class="cp">%></span> 2616 <span class="cp"><%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">submit</span> <span class="s2">
2616"Submit"</span> <span class="cp">%></span> 2617 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2618<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2619</pre> 2620</div> 2621<p>次ã«ã<code>app/views/products/show.html.erb</code>ã®<code>cache</code>ãããã¯ã®ä¸ã«ä»¥ä¸ã®ã³ã¼ãã追å ãã¦ãä¸ã®ãã¼ã·ã£ã«ãã¬ã³ããªã³ã°ãã¾ãã</p> 2622<div class="code_container"> 2623<pre class="highlight"> 2624<span class="c"><%# app/views/products/show.html.erb %></span> 2625<span class="cp"><%=</span> <span class="n">render</span> <span class="s2">"inventory"</span><span class="p">,</span> <span class="ss">product: </span><span class="vi">@product</span> <span class="cp">%></span> 2626</pre> 2627</div> 2628<h4 id="ãå¨åº«ãããã¡ã¼ã«ã«ããéç¥æ©è½ã追å ãã"><a class="anchorlink" href="#%E3%80%8C%E5%9C%A8%E5%BA%AB%E3%81%82%E3%82%8A%E3%80%8D%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E9%80%9A%E7%9F%A5%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">16.3 ãå¨åº«ãããã¡ã¼ã«ã«ããéç¥æ©è½ã追å ãã</a></h4> 2629<p>ååã®å¨åº«ã復活ããã¨ãã«è³¼èªè ã«éç¥ããæ©è½ã«ã¯ãRailsã®ã¡ã¼ã«éä¿¡æ©è½ã§ãã<a href="action_mailer_basics.html">Action Mailer</a>ã使ããã¨ã«ãã¾ãã</p> 2630<p>以ä¸ã®ã³ãã³ããå®è¡ãããã¨ã§ã¡ã¼ã©ã¼ãçæã§ãã¾ãã</p> 2631<div class="code_container"> 2632<pre class="highlight"> 2633<span class="gp">$</span><span class="w"> </span>bin/rails g mailer Product in_stock 2634</pre> 2635</div> 2636<p>ããã«ããã<code>app/mailers/product_mailer.rb</code>ã«<code>in_stock</code>ã¡ã½ãããæã¤ã¯ã©ã¹ãçæããã¾ãã</p> 2637<p>è³¼èªè ã®ã¡ã¼ã«ã¢ãã¬ã¹ã«ã¡ã¼ã«ãéä¿¡ã§ããããã«ããã«ã¯ããã®<code>in_stock</code>ã¡ã½ããã以ä¸ã®ããã«æ´æ°ãã¾ãã</p> 2638<div class="code_container"> 2639<pre class="highlight"> 2640<span class="c1"># app/mailers/product_mailer.rb</span> 2641<span class="k">class</span> <span class="nc">ProductMailer</span> <span class="o"><</span> <span class="no">ApplicationMailer</span> 2642 <span class="c1"># Subject can be set in your I18n file at config/locales/en.yml</span> 2643 <span class="c1"># with the following lookup:</span> 2644 <span class="c1">#</span> 2645 <span class="c1"># en.product_mailer.in_stock.subject</span> 2646 <span class="c1">#</span> 2647 <span class="k">def</span> <span class="nf">in_stock</span> 2648 <span class="vi">@product</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="ss">:product</span><span class="p">]</span> 2649 <span class="n">mail</span> <span class="ss">to: </span><span class="n">params</span><span class="p">[</span><span class="ss">:subscriber</span><span class="p">].</span><span class="nf">email</span> 2650 <span class="k">end</span> 2651<span class="k">end</span> 2652</pre> 2653</div> 2654<p>Action Mailerã®ã¸ã§ãã¬ã¼ã¿ãå®è¡ããã¨ã<code>app/views/</code>ãã©ã«ãã®ä¸ã«ãã¡ã¼ã«ãã³ãã¬ã¼ãã2ã¤çæããã¾ãã1ã¤ã¯HTMLã¡ã¼ã«ã®éä¿¡ç¨ããã1ã¤ã¯ããã¹ãã¡ã¼ã«ã®éä¿¡ç¨ã§ãã 2655ãããã®ãã³ãã¬ã¼ããæ´æ°ãããã¨ã§ããå¨åº«ãããã¡ãã»ã¼ã¸ã製åã¸ã®ãªã³ã¯ãã¡ã¼ã«ã«å«ããããããã«ãªãã¾ãã</p> 2656<p><code>app/views/product_mailer/in_stock.html.erb</code>ã以ä¸ã®ããã«å¤æ´ãã¾ãã</p> 2657<div class="code_container"> 2658<pre class="highlight"> 2659<span class="c"><%# app/views/product_mailer/in_stock.html.erb %></span> 2660<span class="nt"><h1></span>Good news!<span class="nt"></h1></span> 2661 2662<span class="nt"><p></span><span class="cp"><%=</span> <span class="n">link_to</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span><span class="p">,</span> <span class="n">product_url</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> is back in stock.<span class="nt"></p></span> 2663</pre> 2664</div> 2665<p><code>app/views/product_mailer/in_stock.text.erb</code>ã以ä¸ã®ããã«å¤æ´ãã¾ãã</p> 2666<div class="code_container"> 2667<pre class="highlight"> 2668Good news! 2669 2670<span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span> is back in stock. 2671<span class="cp"><%=</span> <span class="n">product_url</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> 2672</pre> 2673</div> 2674<p>ã¡ã¼ã«ã¯ã©ã¤ã¢ã³ãã§ã¦ã¼ã¶ã¼ããªã³ã¯ãã¯ãªãã¯ããã¨ãã«ãã©ã¦ã¶ã§éãããã«ããã«ã¯ãç¸å¯¾ãã¹ã§ã¯ãªãå®å ¨ãªURLãå¿ è¦ãªã®ã§ãã¡ã¼ã©ã¼ã§ã¯<code>product_path</code>ã§ã¯ãªã<code>product_url</code>ã使ãã¾ãã</p> 2675<p><code>bin/rails console</code>ã§Railsã³ã³ã½ã¼ã«ãéãã¦ã以ä¸ã®ããã«éä¿¡å ã®è£½åã¨ãµãã¹ã¯ã©ã¤ããèªã¿è¾¼ããã¨ã§ãã¡ã¼ã«ããã¹ãã§ãã¾ãã</p> 2676<div class="code_container"> 2677<pre class="highlight"> 2678store(dev)> product = Product.first 2679store(dev)> subscriber = product.subscribers.find_or_create_by(email: "[email protected]") 2680store(dev)> ProductMailer.with(product: product, subscriber: subscriber).in_stock.deliver_later 2681</pre> 2682</div> 2683<p>ã¡ã¼ã«ãéä¿¡ããããã¨ããã°ã§ä»¥ä¸ã®ããã«ç¢ºèªã§ãã¾ãã</p> 2684<div class="code_container"> 2685<pre class="highlight"> 2686ProductMailer#in_stock: processed outbound mail in 63.0ms 2687Delivered mail [email protected] (33.1ms) 2688Date: Fri, 26 Jul 2024 08:50:39 -0500 2689From: [email protected] 2690To: [email protected] 2691Message-ID: <[email protected]> 2692Subject: In stock 2693Mime-Version: 1.0 2694Content-Type: multipart/alternative; 2695 boundary="--==_mimepart_66a3a9afd235e_108b04a4c4136f"; 2696 charset=UTF-8 2697Content-Transfer-Encoding: 7bit 2698 2699 2700----==_mimepart_66a3a9afd235e_108b04a4c4136f 2701Content-Type: text/plain; 2702 charset=UTF-8 2703Content-Transfer-Encoding: 7bit 2704 2705Good news! 2706 2707T-Shirt is back in stock. 2708http://localhost:3000/products/1 2709 2710 2711----==_mimepart_66a3a9afd235e_108b04a4c4136f 2712Content-Type: text/html; 2713 charset=UTF-8 2714Content-Transfer-Encoding: 7bit 2715 2716<!-- BEGIN app/views/layouts/mailer.html.erb --><!DOCTYPE html> 2717<html> 2718 <head> 2719 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 2720 <style> 2721 /* Email styles need to be inline */ 2722 </style> 2723 </head> 2724 2725 <body> 2726 <!-- BEGIN app/views/product_mailer/in_stock.html.erb --><h1>Good news!</h1> 2727 2728<p><a href="http://localhost:3000/products/1">T-Shirt</a> is back in stock.</p> 2729<!-- END app/views/product_mailer/in_stock.html.erb --> 2730 </body> 2731</html> 2732<!-- END app/views/layouts/mailer.html.erb --> 2733----==_mimepart_66a3a9afd235e_108b04a4c4136f-- 2734 2735Performed ActionMailer::MailDeliveryJob (Job ID: 5e2bd5f2-f54f-4088-ace3-3f6eb15aaf46) from Async(default) in 111.34ms 2736</pre> 2737</div> 2738<p>ãããã®ã¡ã¼ã«ãããªã¬ã¼ããã«ã¯ãå¨åº«æ°ã0ããæ£ã®æ°ã«å¤ãããã³ã«ã¡ã¼ã«ãé
2738ä¿¡ããã³ã¼ã«ããã¯ã<code>Product</code>ã¢ãã«ã«è¿½å ãã¾ãã</p> 2739<div class="code_container"> 2740<pre class="highlight"> 2741<span class="c1"># app/models/product.rb</span> 2742<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2743 <span class="n">has_many</span> <span class="ss">:subscribers</span><span class="p">,</span> <span class="ss">dependent: :destroy</span> 2744 <span class="n">has_one_attached</span> <span class="ss">:featured_image</span> 2745 <span class="n">has_rich_text</span> <span class="ss">:description</span> 2746 2747 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">presence: </span><span class="kp">true</span> 2748 <span class="n">validates</span> <span class="ss">:inventory_count</span><span class="p">,</span> <span class="ss">numericality: </span><span class="p">{</span> <span class="ss">greater_than_or_equal_to: </span><span class="mi">0</span> <span class="p">}</span> 2749 2750 <span class="n">after_update_commit</span> <span class="ss">:notify_subscribers</span><span class="p">,</span> <span class="ss">if: :back_in_stock?</span> 2751 2752 <span class="k">def</span> <span class="nf">back_in_stock?</span> 2753 <span class="n">inventory_count_previously_was</span><span class="p">.</span><span class="nf">zero?</span> <span class="o">&&</span> <span class="n">inventory_count</span><span class="p">.</span><span class="nf">positive?</span> 2754 <span class="k">end</span> 2755 2756 <span class="k">def</span> <span class="nf">notify_subscribers</span> 2757 <span class="n">subscribers</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">subscriber</span><span class="o">|</span> 2758 <span class="no">ProductMailer</span><span class="p">.</span><span class="nf">with</span><span class="p">(</span><span class="ss">product: </span><span class="nb">self</span><span class="p">,</span> <span class="ss">subscriber: </span><span class="n">subscriber</span><span class="p">).</span><span class="nf">in_stock</span><span class="p">.</span><span class="nf">deliver_later</span> 2759 <span class="k">end</span> 2760 <span class="k">end</span> 2761<span class="k">end</span> 2762</pre> 2763</div> 2764<p>ä¸ã§è¿½å ãã<a href="https://railsguides.jp/active_record_callbacks.html#after-commit%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9"><code>after_update_commit</code></a>ã¯ã夿´ããã¼ã¿ãã¼ã¹ã«ä¿åãããç´å¾ã«å®è¡ãããActive Recordã³ã¼ã«ããã¯ã§ãã 2765<code>if: :back_in_stock?</code>ã¯ã<code>back_in_stock?</code>ã¡ã½ããã<code>true</code>ãè¿ãå ´åã«ã®ã¿ã³ã¼ã«ããã¯ãå®è¡ããããã«æç¤ºãã¾ãã</p> 2766<p>Active Recordã§å±æ§ã®å¤æ´ããã©ããã³ã°ã§ããããã«ããããã«ã<code>back_in_stock?</code>ã¡ã½ããã§ã¯<code>inventory_count</code>ã®ç´åã®å¤ã確èªããã®ã«<code>inventory_count_previously_was</code>ï¼<code>inventory_count</code>屿§ããèªåçæããã<a href="https://api.rubyonrails.org/v8.1/classes/ActiveModel/Dirty.html#method-i-attribute_previously_was"><code>屿§å_previously_was</code></a>ã¡ã½ããï¼ã使ã£ã¦ãã¾ããç¶ãã¦ããã®å¤ãç¾å¨ã®å¨åº«æ°ã¨æ¯è¼ãã¦ã製åã®å¨åº«ã復活ãããã©ããã夿ãã¾ãã</p> 2767<p><code>notify_subscribers</code>ã¯ãç¹å®ã®è£½åã®ãã¹ã¦ã®è³¼èªè ã®ãªã¹ããå¾ãããã«Active Recordé¢é£ä»ããå©ç¨ãã¦<code>subscribers</code>ãã¼ãã«ãç §ä¼ãã¦ãããåå¥ã®è³¼èªè ã«éä¿¡ãã<code>in_stock</code>ã¡ã¼ã«ããã¥ã¼ã«ç»é²ãã¾ãã</p> 2768<h4 id="å ±éã³ã¼ããconcernã«æ½åºãã"><a class="anchorlink" href="#%E5%85%B1%E9%80%9A%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92concern%E3%81%AB%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B">16.4 å ±éã³ã¼ããconcernã«æ½åºãã</a></h4> 2769<p>ãã®<code>Product</code>ã¢ãã«ã«ã¯ãéç¥ãå¦çããããã®ã³ã¼ããããªãå¤ãå«ã¾ã
2769ã¦ãã¾ããRailsã§ã¯ãããã<a href="https://api.rubyonrails.org/v8.1/classes/ActiveSupport/Concern.html"><code>ActiveSupport::Concern</code></a>ã«åãåºããã¨ã§ã³ã¼ããæ´çã§ãã¾ããconcernã¯é常ã®Rubyã¢ã¸ã¥ã¼ã«ã§ããã使ããããããããã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ã¼ã追å ããã¦ãã¾ãã</p> 2770<p>æåã«ã<code>Notifications</code>ã¢ã¸ã¥ã¼ã«ã使ãã¦ã¿ã¾ãããã</p> 2771<p><code>app/models/product/</code>ãã£ã¬ã¯ããªã使ãã¦ããã<code>app/models/product/notifications.rb</code>ãã¡ã¤ã«ã以ä¸ã®å 容ã§ä½æãã¾ãã</p> 2772<div class="code_container"> 2773<pre class="highlight"> 2774<span class="c1"># app/models/product/notifications.rb</span> 2775<span class="k">module</span> <span class="nn">Product::Notifications</span> 2776 <span class="kp">extend</span> <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">Concern</span> 2777 2778 <span class="n">included</span> <span class="k">do</span> 2779 <span class="n">has_many</span> <span class="ss">:subscribers</span><span class="p">,</span> <span class="ss">dependent: :destroy</span> 2780 <span class="n">after_update_commit</span> <span class="ss">:notify_subscribers</span><span class="p">,</span> <span class="ss">if: :back_in_stock?</span> 2781 <span class="k">end</span> 2782 2783 <span class="k">def</span> <span class="nf">back_in_stock?</span> 2784 <span class="n">inventory_count_previously_was</span><span class="p">.</span><span class="nf">zero?</span> <span class="o">&&</span> <span class="n">inventory_count</span><span class="p">.</span><span class="nf">positive?</span> 2785 <span class="k">end</span> 2786 2787 <span class="k">def</span> <span class="nf">notify_subscribers</span> 2788 <span class="n">subscribers</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">subscriber</span><span class="o">|</span> 2789 <span class="no">ProductMailer</span><span class="p">.</span><span class="nf">with</span><span class="p">(</span><span class="ss">product: </span><span class="nb">self</span><span class="p">,</span> <span class="ss">subscriber: </span><span class="n">subscriber</span><span class="p">).</span><span class="nf">in_stock</span><span class="p">.</span><span class="nf">deliver_later</span> 2790 <span class="k">end</span> 2791 <span class="k">end</span> 2792<span class="k">end</span> 2793</pre> 2794</div> 2795<p>ãã®ã¢ã¸ã¥ã¼ã«ãã¯ã©ã¹ã«<code>include</code>ãããã¨ã<a href="https://railsguides.jp/association_basics.html#entryable%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B"><code>included</code></a>ãããã¯å ã«è¨è¿°ããã³ã¼ãã¯ãæåãããã®ã¯ã©ã¹ã®ä¸é¨ã§ãããã®ããã«å®è¡ããã¾ããã¾ãããã®ã¢ã¸ã¥ã¼ã«å ã§å®ç¾©ããã¡ã½ããã¯ããã®ã¯ã©ã¹ã®ãªãã¸ã§ã¯ãï¼ã¤ã³ã¹ã¿ã³ã¹ï¼ã§å¼ã³åºããé常ã®ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã«ãªãã¾ãã</p> 2796<p>éç¥ãããªã¬ã¼ããã³ã¼ãã<code>Notification</code>ã¢ã¸ã¥ã¼ã«ã«åãåºããã®ã§ã<code>app/models/product.rb</code>ã¢ãã«ã§ä»¥ä¸ã®ããã«<code>Notifications</code>ã¢ã¸ã¥ã¼ã«ã<code>include</code>ãã¦ã³ã¼ããç°¡æ½ã«ã§ãã¾ãã</p> 2797<div class="code_container"> 2798<pre class="highlight"> 2799<span class="c1"># app/models/product.rb</span> 2800<span class="k">class</span> <span class="nc">Product</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2801 <span class="kp">include</span> <span class="no">Notifications</span> 2802 2803 <span class="n">has_one_attached</span> <span class="ss">:featured_image</span> 2804 <span class="n">has_rich_text</span> <span class="ss">:description</span> 2805 2806 <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">presence: </span><span class="kp">true</span> 2807 <span class="n">validates</span> <span class="ss">:inventory_count</span><span class="p">,</span> <span class="ss">numericality: </span><span class="p">{</span> <span class="ss">greater_than_or_equal_to: </span><span class="mi">0</span> <span class="p">}</span> 2808<span class="k">end</span> 2809</pre> 2810</div> 2811<p>concernã¯ãRailsã¢ããªã±ã¼ã·ã§ã³ã®æ©è½ãæ´çããããã®åªããææ³ã®ã²ã¨ã¤ã§ãã製åã«æ©è½ãç¹°ãè¿ã追å ãã¦ããã¨ãããã¦ã¯ã©ã¹ãä¹±éã«ãªãã¾ãã代ããã«ãconcernã使ã£ã¦åæ©è½ã<code>Product::Notifications</code>ãªã©ã®èªå·±å®çµåã¢ã¸ã¥ã¼ã«ã«æ½åºã§ãã¾ãããã®ã¢ã¸ã¥ã¼ã«ã«ã¯ããµãã¹ã¯ã©ã¤ãã®å¦çã¨éç¥ã®éä¿¡æ¹æ³ã«é¢ããæ©è½ããã¹ã¦å«ã¾ãã¦ãã¾ãã</p> 2812<p>ã³ã¼ããconcernã«æ½åºããã¨ãæ©è½ã®åå©ç¨æ§ãé«ã¾ãã¾ãããã¨ãã°ããµãã¹ã¯ã©ã¤ãéç¥ãå¿ è¦ã¨ããæ°ããã¢ãã«ãæè»½ã«å°å ¥ã§ããããã«ãªãã¾ãããã®ã¢ã¸ã¥ã¼ã«ãå©ç¨ããè
2812¤æ°ã®ã¢ãã«ã§åãæ©è½ãæä¾ã§ãã¾ãã</p> 2813<h4 id="éç¥è³¼èªã®è§£é¤ãªã³ã¯ãã¡ã¼ã«ã«è¿½å ãã"><a class="anchorlink" href="#%E9%80%9A%E7%9F%A5%E8%B3%BC%E8%AA%AD%E3%81%AE%E8%A7%A3%E9%99%A4%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">16.5 éç¥è³¼èªã®è§£é¤ãªã³ã¯ãã¡ã¼ã«ã«è¿½å ãã</a></h4> 2814<p>éç¥ãè³¼èªããã¦ã¼ã¶ã¼ãè³¼èªãè§£é¤ã§ããããã«ãã¦ããããã®ã§ã次ã¯è³¼èªã®è§£é¤æ©è½ãæ§ç¯ãããã¨ã«ãã¾ãããã</p> 2815<p>æåã«ã<code>config/routes.rb</code>ã®ã«ã¼ãã£ã³ã°ã«è³¼èªè§£é¤ç¨ã®ã«ã¼ãã£ã³ã°ã追å ããå¿ è¦ãããã¾ããããã¯è§£é¤ç¨ã¡ã¼ã«ã«å«ããURLã¨ãã¦ä½¿ããã¾ãã</p> 2816<div class="code_container"> 2817<pre class="highlight"> 2818<span class="c1"># config/routes.rb</span> 2819<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span> 2820 <span class="c1"># ...</span> 2821 <span class="n">resources</span> <span class="ss">:products</span> <span class="k">do</span> 2822 <span class="n">resources</span> <span class="ss">:subscribers</span><span class="p">,</span> <span class="ss">only: </span><span class="p">[</span> <span class="ss">:create</span> <span class="p">]</span> 2823 <span class="k">end</span> 2824 <span class="n">resource</span> <span class="ss">:unsubscribe</span><span class="p">,</span> <span class="ss">only: </span><span class="p">[</span> <span class="ss">:show</span> <span class="p">]</span> 2825</pre> 2826</div> 2827<p>è³¼èªè§£é¤ç¨ã®ã«ã¼ãã£ã³ã°ã¯æä¸ä½ã¬ãã«ã«è¿½å ãã¾ãã<code>/unsubscribe?token=xyz</code>ã®ãããªã«ã¼ãã£ã³ã°ãå¦çããããã«ãåæ°å½¢ã®<code>resource</code>ã¡ã½ããã使ã£ã¦ããã«ã注æãã ããã</p> 2828<p>Active Recordã«ã¯ããã¾ãã¾ãªç®çã§ãã¼ã¿ãã¼ã¹ã¬ã³ã¼ããæ¤ç´¢ããããã®ä¸æã®ãã¼ã¯ã³ãçæã§ãã<a href="https://api.rubyonrails.org/v8.1/classes/ActiveRecord/TokenFor/ClassMethods.html#method-i-generates_token_for"><code>generates_token_for</code></a>ã¨ããæ©è½ãããã¾ããããã使ã£ã¦ãé»åã¡ã¼ã«ã®ç»é²è§£é¤ç¨URLã«å«ãã䏿ã®ç»é²è§£é¤ç¨ãã¼ã¯ã³ã<code>Subscriber</code>ã¢ãã«ã§çæã§ãã¾ãã</p> 2829<div class="code_container"> 2830<pre class="highlight"> 2831<span class="c1"># app/models/subscriber.rb</span> 2832<span class="k">class</span> <span class="nc">Subscriber</span> <span class="o"><</span> <span class="no">ApplicationRecord</span> 2833 <span class="n">belongs_to</span> <span class="ss">:product</span> 2834 <span class="n">generates_token_for</span> <span class="ss">:unsubscribe</span> 2835<span class="k">end</span> 2836</pre> 2837</div> 2838<p>ã³ã³ããã¼ã©ã¯æåã«ãURLã«å«ã¾ãããã¼ã¯ã³ãç¨ãã¦<code>Subscriber</code>
2838ã®ã¬ã³ã¼ããæ¤ç´¢ãã対å¿ããè³¼èªè ãè¦ã¤ãã£ãããã¬ã³ã¼ããç ´æ£ï¼<code>destroy</code>ï¼ãã¦ãã¼ã ãã¼ã¸ã«ãªãã¤ã¬ã¯ããã¾ãã</p> 2839<p><code>app/controllers/unsubscribes_controller.rb</code>ã以ä¸ã®å 容ã§ä½æãã¾ãã</p> 2840<div class="code_container"> 2841<pre class="highlight"> 2842<span class="c1"># app/controllers/unsubscribes_controller.rb</span> 2843<span class="k">class</span> <span class="nc">UnsubscribesController</span> <span class="o"><</span> <span class="no">ApplicationController</span> 2844 <span class="n">allow_unauthenticated_access</span> 2845 <span class="n">before_action</span> <span class="ss">:set_subscriber</span> 2846 2847 <span class="k">def</span> <span class="nf">show</span> 2848 <span class="vi">@subscriber</span><span class="o">&</span><span class="p">.</span><span class="nf">destroy</span> 2849 <span class="n">redirect_to</span> <span class="n">root_path</span><span class="p">,</span> <span class="ss">notice: </span><span class="s2">"Unsubscribed successfully."</span> 2850 <span class="k">end</span> 2851 2852 <span class="kp">private</span> 2853 2854 <span class="k">def</span> <span class="nf">set_subscriber</span> 2855 <span class="vi">@subscriber</span> <span class="o">=</span> <span class="no">Subscriber</span><span class="p">.</span><span class="nf">find_by_token_for</span><span class="p">(</span><span class="ss">:unsubscribe</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="ss">:token</span><span class="p">])</span> 2856 <span class="k">end</span> 2857<span class="k">end</span> 2858</pre> 2859</div> 2860<p>ä»ä¸ãã«ãç»é²è§£é¤ç¨ãªã³ã¯ãã¡ã¼ã«ãã³ãã¬ã¼ãã«è¿½å ãã¾ãããã</p> 2861<p><code>app/views/product_mailer/in_stock.html.erb</code>ã§ä»¥ä¸ã®ããã«<code>link_to</code>ã追å ãã¾ãã</p> 2862<div class="code_container"> 2863<pre class="highlight"> 2864<span class="c"><%# app/views/product_mailer/in_stock.html.erb %></span> 2865<span class="nt"><h1></span>Good news!<span class="nt"></h1></span> 2866 2867<span class="nt"><p></span><span class="cp"><%=</span> <span class="n">link_to</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span><span class="p">,</span> <span class="n">product_url</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> is back in stock.<span class="nt"></p></span> 2868 2869<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Unsubscribe"</span><span class="p">,</span> <span class="n">unsubscribe_url</span><span class="p">(</span><span class="ss">token: </span><span class="n">params</span><span class="p">[</span><span class="ss">:subscriber</span><span class="p">].</span><span class="nf">generate_token_for</span><span class="p">(</span><span class="ss">:unsubscribe</span><span class="p">))</span> <span class="cp">%></span> 2870</pre> 2871</div> 2872<p><code>app/views/product_mailer/in_stock.text.erb</code>ã«ã以ä¸ã®ããã«å¹³æã§URLã追å ãã¾ãã</p> 2873<div class="code_container"> 2874<pre class="highlight"> 2875<span class="c"><%# app/views/product_mailer/in_stock.text.erb %></span> 2876Good news! 2877 2878<span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span> is back in stock. 2879<span class="cp"><%=</span> <span class="n">product_url</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> 2880 2881Unsubscribe: <span class="cp"><%=</span> <span class="n">unsubscribe_url</span><span class="p">(</span><span class="ss">token: </span><span class="n">params</span><span class="p">[</span><span class="ss">:subscriber</span><span class="p">].</span><span class="nf">generate_token_for</span><span class="p">(</span><span class="ss">:unsubscribe</span><span class="p">))</span> <span class="cp">%></span> 2882</pre> 2883</div> 2884<p>ã¦ã¼ã¶ã¼ããã®ç»é²è§£é¤ç¨ãªã³ã¯ãã¯ãªãã¯ããã¨ããã¼ã¿ãã¼ã¹ãã<code>Subscriber</code>ã®ã¬ã³ã¼ããåé¤ããã¾ãã追å ããã³ã³ããã¼ã©ã¯ãç¡å¹ãªãã¼ã¯ã³ãæéåãã®ãã¼ã¯ã³ãã¨ã©ã¼ãªãã§å®å ¨ã«å¦çãã¾ãã</p> 2885<p>Railsã³ã³ã½ã¼ã«ãèµ·åãã¦ã¡ã¼ã«ããã1ä»¶éä¿¡ãããã°ã«è¡¨ç¤ºãããç»é²è§£é¤ãªã³ã¯ï¼<code>Unsubscribe:</code>ã§å§ã¾ãã¾ãï¼ã®URLãè¦ã¤ãã¦ãã©ã¦ã¶ã§éããæ£å¸¸ã«ç»é²è§£é¤ã§ãããã¨ããã¹ããã¦ã¿ã¦ãã ãããæåããã¨storeã®ããããã¼ã¸ãéãã¦ãUnsubscribed successfully.ãã¨è¡¨ç¤ºããã¾ãã</p> 2886<h3 id="cssã¨javascriptã追å ãã"><a class="anchorlink" href="#css%E3%81%A8javascript%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">17 CSSã¨JavaScriptã追å ãã</a></h3> 2887<p>CSSãJavaScriptã¯Webã¢ããªã±ã¼ã·ã§ã³æ§ç¯ã®ä¸å¿ã¨ãªããããRailsã§ã®å©ç¨æ¹æ³ãå¦ã³ã¾ãããã</p> 2888<h4 id="propshaft"><a class="anchorlink" href="#propshaft">17.1 Propshaft</a></h4> 2889<p>Railsã§ããCSSããJavaScriptããç»åããªã©ã®ã¢ã»ãããåå¾ãã¦ãã©ã¦ã¶ã«é ä¿¡ãã<strong>ã¢ã»ãããã¤ãã©ã¤ã³</strong>ï¼asset pipelineï¼ã«ã¯ã<a href="https://github.com/rails/propshaft">Propshaft</a>ã使ããã¦ãã¾ãã</p> 2890<p>productionç°å¢ã®Propshaftã¯ãã¢ã»ããã®åãã¼ã¸ã§ã³ããã©ããã³ã°ãã¦ãã£ãã·ã¥ãããã¨ã§ããã¼ã¸ãé«éåãã¾ããã¢ã»ãããã¤ãã©ã¤ã³ã®ä»çµã
2890¿ã«ã¤ãã¦è©³ããã¯ã<a href="asset_pipeline.html">ã¢ã»ãã ãã¤ãã©ã¤ã³ ã¬ã¤ã</a>ãåç §ãã¦ãã ããã</p> 2891<div class="note"><p>訳注: Rails 8.0ããã¯ã徿¥ã®<a href="https://github.com/rails/sprockets">Sprockets</a>ã«ä»£ãã£ã¦Propshaftãããã©ã«ãã®ã¢ã»ãããã¤ãã©ã¤ã³ã«ãªãã¾ããã</p></div> 2892<p><code>app/assets/stylesheets/application.css</code>ãã¡ã¤ã«ã以ä¸ã®ããã«æ´æ°ãã¦ããã©ã³ããsans-serifã«å¤æ´ãã¦ã¿ã¾ãããã</p> 2893<div class="code_container"> 2894<pre class="highlight"> 2895/* app/assets/stylesheets/application.css */ 2896body { 2897 font-family: Arial, Helvetica, sans-serif; 2898 padding: 1rem; 2899} 2900 2901nav { 2902 justify-content: flex-end; 2903 display: flex; 2904 font-size: 0.875em; 2905 gap: 0.5rem; 2906 max-width: 1024px; 2907 margin: 0 auto; 2908 padding: 1rem; 2909} 2910 2911nav a { 2912 display: inline-block; 2913} 2914 2915main { 2916 max-width: 1024px; 2917 margin: 0 auto; 2918} 2919 2920.alert, 2921.error { 2922 color: red; 2923} 2924 2925.notice { 2926 color: green; 2927} 2928 2929section.product { 2930 display: flex; 2931 gap: 1rem; 2932 flex-direction: row; 2933} 2934 2935section.product img { 2936 border-radius: 8px; 2937 flex-basis: 50%; 2938 max-width: 50%; 2939} 2940</pre> 2941</div> 2942<p>ç¶ãã¦ã<code>app/views/products/show.html.erb</code>ãã¡ã¤ã«ã以ä¸ã®ããã«æ´æ°ãã¦ãæ°ããã¹ã¿ã¤ã«ãåæ ãã¾ãã</p> 2943<div class="code_container"> 2944<pre class="highlight"> 2945<span class="c"><%# app/views/products/show.html.erb %></span> 2946<span class="nt"><p></span><span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Back"</span><span class="p">,</span> <span class="n">products_path</span> <span class="cp">%></span><span class="nt"></p></span> 2947 2948<span class="nt"><section</span> <span class="na">class=</span><span class="s">"product"</span><span class="nt">></span> 2949 <span class="cp"><%=</span> <span class="n">image_tag</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">featured_image</span> <span class="k">if</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">featured_image</span><span class="p">.</span><span class="nf">attached?</span> <span class="cp">%></span> 2950 2951 <span class="nt"><section</span> <span class="na">class=</span><span class="s">"product-info"</span><span class="nt">></span> 2952 <span class="cp"><%</span> <span class="n">cache</span> <span class="vi">@product</span> <span class="k">do</span> <span class="cp">%></span> 2953 <span class="nt"><h1></span><span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">name</span> <span class="cp">%></span><span class="nt"></h1></span> 2954 <span class="cp"><%=</span> <span class="vi">@product</span><span class="p">.</span><span class="nf">description</span> <span class="cp">%></span> 2955 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2956 2957 <span class="cp"><%=</span> <span class="n">render</span> <span class="s2">"inventory"</span><span class="p">,</span> <span class="ss">product: </span><span class="vi">@product</span> <span class="cp">%></span> 2958 2959 <span class="cp"><%</span> <span class="k">if</span> <span class="n">authenticated?</span> <span class="cp">%></span> 2960 <span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Edit"</span><span class="p">,</span> <span class="n">edit_product_path</span><span class="p">(</span><span class="vi">@product</span><span class="p">)</span> <span class="cp">%></span> 2961 <span class="cp"><%=</span> <span class="n">button_to</span> <span class="s2">"Delete"</span><span class="p">,</span> <span class="vi">@product</span><span class="p">,</span> <span class="ss">method: :delete</span><span class="p">,</span> <span class="ss">data: </span><span class="p">{</span> <span class="ss">turbo_confirm: </span><span class="s2">"Are you sure?"</span> <span class="p">}</span> <span class="cp">%></span> 2962 <span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span> 2963 <span class="nt"></section></span> 2964<span class="nt"></section></span> 2965</pre> 2966</div> 2967<p>ãã©ã¦ã¶ã§ãã¼ã¸ãåèªã¿è¾¼ã¿ããã¨ãCSSãåæ ããããã¨ã確èªã§ãã¾ãã</p> 2968<h4 id="importmap"><a class="anchorlink" href="#importmap">17.2 importmap</a></h4> 2969<p>Railsã®JavaScriptã§ã¯ãããã©ã«ãã§<a href="https://developer.mozilla.org/ja/docs/Web/HTML/Element/script/type/importmap">importmap</a>ãçµç±ããå½¢ã§å©ç¨ãã¾ããããã«ããããã«ãã¹ããããå¿ è¦ã¨ããã«ç¾ä»£ã®JavaScriptã¢ã¸ã¥ã¼ã«ãæ¸ããããã«ãªãã¾ãã</p> 2970<p>å©ç¨ããJavaScriptããã±ã¼ã¸åã¯ã<code>config/importmap.rb</code>ã«è¨è¿°ããã¾ãããã®ãã¡ã¤ã«ã¯ãå©ç¨ããJavaScriptããã±ã¼ã¸åãããã©ã¦ã¶ã§importmapã¿ã°ãçæããããã®ã½ã¼ã¹ãã¡ã¤ã«ã¨<code>pin</code>ã§å¯¾å¿ä»ãã¾ãã</p> 2971<div class="code_container"> 2972<pre class="highlight"> 2973<span class="c1"># config/importmap.rb</span> 2974<span class="c1"># Pin npm packages by running ./bin/importmap</span> 2975 2976<span class="n">pin</span> <span class="s2">"application"</span> 2977<span class="n">pin</span> <span class="s2">"@hotwired/turbo-rails"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"turbo.min.js"</span> 2978<span class="n">pin</span> <span class="s2">"@hotwired/stimulus"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"stimulus.min.js"</span> 2979<span class="n">pin</span> <span class="s2">"@hotwired/stimulus-loading"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"stimulus-loading.js"</span> 2980<span class="n">pin_all_from</span> <span class="s2">"app/javascript/controllers"</span><span class="p">,</span> <span class="ss">under: </span><span class="s2">"controllers"</span> 2981<span class="n">pin</span> <span class="s2">"trix"</span> 2982<span class="n">pin</span> <span class="s2">
2982"@rails/actiontext"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"actiontext.esm.js"</span> 2983</pre> 2984</div> 2985<div class="info"><p>ä¸ã®<code>pin</code>ã¯ãããããJavaScriptããã±ã¼ã¸åï¼ä¾: <code>"@hotwired/turbo-rails"</code>ï¼ãç¹å®ã®ãã¡ã¤ã«ãURLï¼ä¾: <code>"turbo.min.js"</code>ï¼ã«å¯¾å¿ä»ãã¾ãã<code>pin_all_from</code>ã¯ããã£ã¬ã¯ããªå ã®ãã¹ã¦ã®ãã¡ã¤ã«ï¼ä¾: <code>app/javascript/controllers</code>ï¼ãåå空éï¼ä¾: <code>"controllers"</code>ï¼ã«ä¸æ¬ã§å¯¾å¿ä»ãã¾ãã</p></div> 2986<p>importmapã¯ãææ°ã®JavaScriptæ©è½ããµãã¼ãããã¨åæã«ãJavaScriptã®ã»ããã¢ãããã¯ãªã¼ã³ãã¤æå°éã«ä¿ã¡ã¾ãã</p> 2987<p>Railsã®<code>config/importmap.rb</code>ãã¡ã¤ã«ã«ã¯ãæ¢ã«ããã¤ãã®JavaScriptãã¡ã¤ã«ãåå¨ãã¦ãã¾ãããããã¯ãHotwireã¨å¼ã°ããRailsã®ããã©ã«ãã®ããã³ãã¨ã³ããã¬ã¼ã ã¯ã¼ã¯ã§ãã</p> 2988<h4 id="hotwire"><a class="anchorlink" href="#hotwire">17.3 Hotwire</a></h4> 2989<p><a href="https://hotwired.dev/">Hotwire</a>ã¯ããµã¼ãã¼å´ã§çæãããHTMLãæå¤§éã«æ´»ç¨ããããã«è¨è¨ãããJavaScriptãã¬ã¼ã ã¯ã¼ã¯ã§ã以ä¸ã®3ã¤ã®ã³ã¢ã³ã³ãã¼ãã³ãã§æ§æããã¦ãã¾ãã</p> 2990<ol> 2991<li><p><a href="https://turbo.hotwired.dev/"><strong>Turbo</strong></a>: ã«ã¹ã¿ã JavaScriptãè¨è¿°ããã«ãããã²ã¼ã·ã§ã³ããã©ã¼ã éä¿¡ããã¼ã¸ã³ã³ãã¼ãã³ããæ´æ°ãå¦çãã¾ãã</p></li> 2992<li><p><a href="https://stimulus.hotwired.dev/"><strong>Stimulus</strong></a>: ãã¼ã¸ã«æ©è½ã追å ããã«ã¹ã¿ã JavaScriptãå¿ è¦ãªå ´åã®ãã¬ã¼ã ã¯ã¼ã¯ãæä¾ãã¾ãã</p></li> 2993<li><p><a href="https://native.hotwired.dev/"><strong>Native</strong></a>: Web ã¢ããªãåãè¾¼ã¿ããã¤ãã£ã ã¢ãã¤ã«æ©è½ã§æ®µéçã«æ¡å¼µãããã¨ã§ããã¤ããªããã¢ãã¤ã« ã¢ããªã使ã§ãã¾ãã</p></li> 2994</ol> 2995<p>storeã¢ããªã§ã¯ã¾ã JavaScriptãè¨è¿°ãã¦ãã¾ããããstoreã¢ããªã®ããã³ãã¨ã³ãã§ã¯æ¢ã«Hotwireãåãã¦ãã¾ãããã¨ãã°ã製åã追å ã»ç·¨éããããã«ä½æãããã©ã¼ã ãåããã®ã«æé»ã§Turboã使ããã¦ãã¾ãã</p> 2996<p>詳ããã¯ã<a href="asset_pipeline.html">ã¢ã»ãããã¤ãã©ã¤ã³</a>ã¬ã¤ãã<a href="working_with_javascript_in_rails.html">Railsã§ã®JavaScriptå©ç¨</a>ã¬ã¤ããåç §ãã¦ãã ããã</p> 2997<h3 id="railsã§ãã¹ããæ¸ã"><a class="anchorlink" href="#rails%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F">18 Railsã§ãã¹ããæ¸ã</a></h3> 2998<p>Railsã«ã¯å ç¢ãªãã¹ãã¹ã¤ã¼ããä»å±ãã¦ãã¾ãã製åã®å¨åº«ã復活ããã¨ãã«æ£ããä»¶æ°ã®ã¡ã¼ã«ãéä¿¡ããããã¨ã確èªãããã¹ããè¨è¿°ãã¦ã¿ã¾ãããã</p> 2999<h4 id="ãã£ã¯ã¹ãã£"><a class="anchorlink" href="#%E3%83%95%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%81%E3%83%A3">18.1 ãã£ã¯ã¹ãã£</a></h4> 3000<p>Railsã§ã¢ãã«ãçæããã¨ãã¢ãã«ã«å¯¾å¿ãããã£ã¯ã¹ãã£ãã¡ã¤ã«ã<code>test/fixtures/</code>ãã£ã¬ã¯ããªã«èªåçã«ä½æããã¾ãã</p> 3001<p><strong>ãã£ã¯ã¹ãã£</strong>ï¼fixtureï¼ã¯ããã¹ããå®è¡ããåã«ãã¹ããã¼ã¿ãã¼ã¹ã«åãè¾¼ã¾ããå®ç¾©æ¸ã¿ã®ãã¼ã¿ã»ããã§ãããã£ã¯ã¹ãã£ã¯ãã¬ã³ã¼ããè¦ããããååã§å®ç¾©ã§ããããããã¹ãã§æè»½ã«ã¢ã¯ã»ã¹ã§ãã¾ãã</p> 3002<p>ãã£ã¯ã¹ãã£ãã¡ã¤ã«ã¯ãããã©ã«ãã§ã¯ç©ºãªã®ã§ããã¹ãç¨ã®ãã£ã¯ã¹ãã£ãåãè¾¼ãå¿ è¦ãããã¾ãã</p> 3003<p><code>Product</code>ã¢ãã«ã®ãã¹ãç¨ã«ã<code>test/fixtures/products.yml</code>ãã£ã¯ã¹ãã£ãã¡ã¤ã«ã以ä¸ã®ããã«æ´æ°ãã¾ãããã</p> 3004<div class="code_container"> 3005<pre class="highlight"> 3006# test/fixtures/products.yml 3007tshirt: 3008 name: T-Shirt 3009 inventory_count: 15 3010</pre> 3011</div> 3012<p><code>Subscriber</code>ã¢ãã«ã®ãã¹ãç¨ã«ã以ä¸ã®2ã¤ã®ãã£ã¯ã¹ãã£ã<code>
3012test/fixtures/subscribers.yml</code>ã«è¿½å ãã¾ãã</p> 3013<div class="code_container"> 3014<pre class="highlight"> 3015# test/fixtures/subscribers.yml 3016david: 3017 product: tshirt 3018 email: [email protected] 3019 3020chris: 3021 product: tshirt 3022 email: [email protected] 3023</pre> 3024</div> 3025<p>ãã®<code>subscribers.yml</code>ãã£ã¯ã¹ãã£ãè¦ãã¨ã<code>tshirt</code>ã¨ããååã§<code>Product</code>ç¨ãã£ã¯ã¹ãã£ãåç §ã§ãã¦ãããã¨ããããã¾ããRailsã¯ãããããã¼ã¿ãã¼ã¹å ã§èªåçã«é¢é£ä»ããã®ã§ãã¬ã³ã¼ãIDãé¢é£ä»ãããã¹ãã³ã¼ãå ã§æåã§ç®¡çããå¿ è¦ã¯ããã¾ããã</p> 3026<p>ãããã®ãã£ã¯ã¹ãã£ã¯ããã¹ãã¹ã¤ã¼ããå®è¡ããã¨ãèªåã§ãã¼ã¿ãã¼ã¹ã«æ¿å ¥ããã¾ãã</p> 3027<h4 id="ã¡ã¼ã«éä¿¡ããã¹ããã"><a class="anchorlink" href="#%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B">18.2 ã¡ã¼ã«éä¿¡ããã¹ããã</a></h4> 3028<p><code>test/models/product_test.rb</code>ã«ä»¥ä¸ã®ãã¹ãã追å ãã¦ã¿ã¾ãããã</p> 3029<div class="code_container"> 3030<pre class="highlight"> 3031<span class="c1"># test/models/product_test.rb</span> 3032<span class="nb">require</span> <span class="s2">"test_helper"</span> 3033 3034<span class="k">class</span> <span class="nc">ProductTest</span> <span class="o"><</span> <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">TestCase</span> 3035 <span class="kp">include</span> <span class="no">ActionMailer</span><span class="o">::</span><span class="no">TestHelper</span> 3036 3037 <span class="nb">test</span> <span class="s2">"sends email notifications when back in stock"</span> <span class="k">do</span> 3038 <span class="n">product</span> <span class="o">=</span> <span class="n">products</span><span class="p">(</span><span class="ss">:tshirt</span><span class="p">)</span> 3039 3040 <span class="c1"># 製åãå¨åº«åãã«ãã</span> 3041 <span class="n">product</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="ss">inventory_count: </span><span class="mi">0</span><span class="p">)</span> 3042 3043 <span class="n">assert_emails</span> <span class="mi">2</span> <span class="k">do</span> 3044 <span class="n">product</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="ss">inventory_count: </span><span class="mi">99</span><span class="p">)</span> 3045 <span class="k">end</span> 3046 <span class="k">end</span> 3047<span class="k">end</span> 3048</pre> 3049</div> 3050<p>ãã®ãã¹ãã§è¡ã£ã¦ãããã¨ã1ã¤ãã¤è©³ããè¦ã¦ã¿ã¾ãããã</p> 3051<p>æåã«ãAction Mailerç¨ã®ãã¹ããã«ãã¼ã<code>include</code>ãã¦ããã¹ãä¸ã«éä¿¡ãããã¡ã¼ã«ãç£è¦ã§ããããã«ãã¾ãã</p> 3052<p><code>tshirt</code>ãã£ã¯ã¹ãã£ã¯ ãã£ã¯ã¹ãã£ãçæãã<code>products()</code>ãã«ãã¼ã¡ã½ããã§èªã¿è¾¼ã¾ãããã®ã¬ã³ã¼ãã®Active Recordãªãã¸ã§ã¯ããè¿ãã¾ããåãã£ã¯ã¹ãã£ã¯ãã¹ãã¹ã¤ã¼ãã§ãã®ãããªãã«ãã¼ãçæãã¾ãï¼ãã¼ã¿ãã¼ã¹IDã¯å®è¡ãã¨ã«ç°ãªãå¯è½æ§ãããããããã£ã¯ã¹ãã£ãååã§ç°¡åã«åç §ã§ããããã«ãã¾ãï¼ã</p> 3053<p>次ã«ãå¨åº«ã0ã«æ´æ°ãã¦ãTã·ã£ããå¨åº«åãã®ç¶æ ã«ãã¾ãã</p> 3054<p>次ã«ããããã¯å ã®ã³ã¼ãã«ãã£ã¦2ä»¶ã®ã¡ã¼ã«ãçæããããã¨ã<a href="https://api.rubyonrails.org/v8.1/classes/ActionMailer/TestHelper.html#method-i-assert_emails"><code>assert_emails</code></a>ã¢ãµã¼ã·ã§ã³ã§ç¢ºèªãã¾ãã</p> 3055<p>ã¡ã¼ã«ãããªã¬ã¼ããã«ã¯ããããã¯å ã§è£½åã®å¨åº«æ°ãæ´æ°ãã¾ããããã«ããã<code>Product</code>ã¢ãã«ã®<code>notify_subscribers</code>ã³ã¼ã«ããã¯ãããªã¬ã¼ãããã¡ã¼ã«ãéä¿¡ããã¾ãã</p> 3056<p>å®è¡ãå®äºããã¨ã<code>assert_emails</code>ã¯ã¡ã¼ã«ã®ä»¶æ°ãã«ã¦ã³ãããæå¾ ãããä»¶æ°ã¨ä¸è´ãããã¨ã確èªãã¾ãã</p> 3057<p>以ä¸ã®ããã«ãã¡ã¤ã«åãæå®ãã¦åå¥ã®ãã¹ããã¡ã¤ã«ãå®è¡ãã¦ã¿ã¾ãããããªããåã«<code>bin/rails test</code>ã³ãã³ããå®è¡ããã¨ããã¹ã¦ã®ãã¹ãã¹ã¤ã¼ããå®è¡ãããã¨ãå¯è½ã§ãã</p> 3058<div class="code_container"> 3059<pre class="highlight"> 3060<span class="gp">$</span><span class="w"> </span>bin/rails <span class="nb">test test</span>/models/product_test.rb 3061<span class="go">Running 1 tests in a single process (parallelization threshold is 50) 3062Run options: --seed 3556 3063 3064</span><span class="gp">#</span><span class="w"> </span>Running: 3065<span class="go"> 3066</span><span class="c">. 3067</span><span class="go"> 3068Finished in 0.343842s, 2.9083 runs/s, 5.8166 assertions/s. 30691 runs, 2 assertions, 0 failures, 0 errors, 0 skips 3070</span> 3071</pre> 3072</div> 3073<p><code>product_test.rb</code>ã®ãã¹ãã¯ãã¹ãã¾ãã</p> 3074<p><code>ProductMailer</code>ãçæããã¨ãã«ãã<code>test/mailers/product_mailer_test.rb</code>ã«ãµã³ãã«ãã¹ããçæããã¦ãã¾ãã®ã§ããã¡ãã以ä¸ã®ããã«æ´æ°ãã¦ãã¹ããããã«ãã¾ãããã</p> 3075<div class="code_container"> 3076<pre class="highlight"> 3077<span class="c1"># test/mailers/product_mailer_test.rb</span> 3078<span class="nb">require</span> <span class="s2">"test_helper"</span> 3079 3080<span class="k">class</span> <span class="nc">ProductMailerTest</span> <span class="o"><</span> <span class="no">ActionMailer</span><span class="o">::</span><span class="no">TestCase</span> 3081 <span class="nb">test</span> <span class="s2">"in_stock"</span> <span class="k">do</span> 3082 <span class="n">mail</span> <span class="o">=</span> <span class="no">ProductMailer</span><span class="p">.</span><span class="nf">with</span><span class="p">(</span><span class="ss">product: </span><span class="n">products</span><span class="p">(</span><span class="ss">:tshirt</span><span class="p">),</span> <span class="ss">
3082subscriber: </span><span class="n">subscribers</span><span class="p">(</span><span class="ss">:david</span><span class="p">)).</span><span class="nf">in_stock</span> 3083 <span class="n">assert_equal</span> <span class="s2">"In stock"</span><span class="p">,</span> <span class="n">mail</span><span class="p">.</span><span class="nf">subject</span> 3084 <span class="n">assert_equal</span> <span class="p">[</span> <span class="s2">"[email protected]"</span> <span class="p">],</span> <span class="n">mail</span><span class="p">.</span><span class="nf">to</span> 3085 <span class="n">assert_equal</span> <span class="p">[</span> <span class="s2">"[email protected]"</span> <span class="p">],</span> <span class="n">mail</span><span class="p">.</span><span class="nf">from</span> 3086 <span class="n">assert_match</span> <span class="s2">"Good news!"</span><span class="p">,</span> <span class="n">mail</span><span class="p">.</span><span class="nf">body</span><span class="p">.</span><span class="nf">encoded</span> 3087 <span class="k">end</span> 3088<span class="k">end</span> 3089</pre> 3090</div> 3091<p>ä»åº¦ã¯ä»¥ä¸ã®ããã«å ¨ãã¹ãã¹ã¤ã¼ããå®è¡ãã¦ã¿ãã¨ããã¹ã¦ã®ãã¹ãããã¹ãããã¨ã確èªã§ãã¾ãã</p> 3092<div class="code_container"> 3093<pre class="highlight"> 3094<span class="gp">$</span><span class="w"> </span>bin/rails <span class="nb">test</span> 3095<span class="go">Running 2 tests in a single process (parallelization threshold is 50) 3096Run options: --seed 16302 3097 3098</span><span class="gp">#</span><span class="w"> </span>Running: 3099<span class="go"> 3100</span><span class="c">.. 3101</span><span class="go"> 3102Finished in 0.665856s, 3.0037 runs/s, 10.5128 assertions/s. 31032 runs, 7 assertions, 0 failures, 0 errors, 0 skips 3104</span> 3105</pre> 3106</div> 3107<p>ãããã®ãã¹ããåºçºç¹ã¨ãã¦ãã¢ããªã±ã¼ã·ã§ã³æ©è½ãå®å ¨ã«ã«ãã¼ãããã¹ãã¹ã¤ã¼ããä»å¾ãæ§ç¯ã§ãã¾ãã</p> 3108<p>詳ããã¯ã<a href="testing.html">Railsã¢ããªã±ã¼ã·ã§ã³ã®ãã¹ã</a>ã¬ã¤ããåç §ãã¦ãã ããã</p> 3109<h3 id="rubocopã§ã³ã¼ãã®å½¢å¼ãçµ±ä¸ãã"><a class="anchorlink" href="#rubocop%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%BD%A2%E5%BC%8F%E3%82%92%E7%B5%B1%E4%B8%80%E3%81%99%E3%82%8B">19 RuboCopã§ã³ã¼ãã®å½¢å¼ãçµ±ä¸ãã</a></h3> 3110<p>ã³ã¼ããæ¸ãã¨ãã®ãã©ã¼ããããã人ãå ´æã«ãã£ã¦ã°ãã¤ãã¦ãã¾ããã¨ãããã¾ããRailsã«ã¯ãã³ã¼ãã®ãã©ã¼ããããçµ±ä¸ããããã§å½¹ã«ç«ã¤RuboCopã¨ãã<a href="https://ja.wikipedia.org/wiki/Lint#%E3%80%8Clint%E3%80%8D%E3%81%AE%E6%B4%BE%E7%94%9F%E7%94%A8%E6%B3%95">linter</a>ãä»å±ãã¦ãã¾ãã</p> 3111<p>以ä¸ã®ã³ãã³ããå®è¡ãããã¨ã§ãã³ã¼ããä¸è²«ãã¦ãããã©ããããã§ãã¯ã§ãã¾ãã</p> 3112<div class="code_container"> 3113<pre class="highlight"> 3114<span class="gp">$</span><span class="w"> </span>bin/rubocop 3115</pre> 3116</div> 3117<p>å®è¡ããã¨ãéåã¨ãã®å 容ãåºåããã¾ãã 3118ãªãã以ä¸ã¯éåãçºçãã¦ããªãå ´åã®åºåã§ãã</p> 3119<div class="code_container"> 3120<pre class="highlight"> 3121<span class="go">Inspecting 53 files 3122</span><span class="c">..................................................... 3123</span><span class="go"> 312453 files inspected, no offenses detected 3125</span> 3126</pre> 3127</div> 3128<p>RuboCopã®ã³ãã³ãã§ä»¥ä¸ã®ããã«<code>--autocorrect</code>ï¼ã¾ãã¯ç縮形ã®<code>-a</code>ï¼ãã©ã°ã追å ããã¨ãä¿®æ£å¯è½ãªéåãèªåä¿®æ£ããã¾ãã</p> 3129<div class="code_container"> 3130<pre class="highlight"> 3131<span class="gp">$</span><span class="w"> </span>bin/rubocop <span class="nt">-a</span> 3132</pre> 3133</div> 3134<h3 id="ã»ãã¥ãªãã£ãã§ãã¯"><a class="anchorlink" href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF">20 ã»ãã¥ãªãã£ãã§ãã¯</a></h3> 3135<p>Railsã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®ã»ãã¥ãªãã£åé¡ï¼ã»ãã·ã§ã³ãã¤ã¸ã£ãã¯ãã»ãã·ã§ã³åºå®ããªãã¤ã¬ã¯ããªã©ã®ãæ»æã«ã¤ãªããå¯è½æ§ã®ããèå¼±æ§ï¼ããã§ãã¯ããããã®Brakeman gemãå«ã¾ãã¦ãã¾ãã</p> 3136<p><code>bin/brakeman</code>ã³ãã³ããå®è¡ããã¨ãã¢ããªã±ã¼ã·ã§ã³ã®èå¼±æ§ãåæãã¦ã¬ãã¼ããåºåãã¾ãã</p> 3137<div class="code_container"> 3138<pre class="highlight"> 3139<span class="gp">$</span><span class="w"> </span>bin/brakeman 3140<span class="go">Loading scanner... 3141</span><span class="c">... 3142</span><span class="go"> 3143== Overview == 3144 3145Controllers: 6 3146Models: 6 3147Templates: 15 3148Errors: 0 3149Security Warnings: 0 3150 3151== Warning Types == 3152 3153 3154No warnings found 3155</span> 3156</pre> 3157</div> 3158<p>ã»ãã¥ãªãã£ã«ã¤ãã¦è©³ããã¯ã<a href="security.html">Railsã¢ããªã±ã¼ã·ã§ã³ã®ã»ãã¥ãªãã£</a>ã¬ã¤ããåç §ãã¦ãã ããã</p> 3159<h3 id="github-actionsã§ciãå®è¡ãã"><a class="anchorlink" href="#github-actions%E3%81%A7ci%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">21 GitHub Actionsã§CIãå®è¡ãã</a></h3> 3160<p>Railsã¢ããªãçæããã¨ã<code>.github/</code>ãã©ã«ããçæããã¾ããããã«ã¯ãrubocopãbrakemanããã¹ãã¹ã¤ã¼ããèªåå®è¡ããããäºåæ§ææ¸ã¿ã®<a href="https://github.co.jp/features/actions">GitHub Actions</a>è¨å®ãå«ã¾ãã¦ãã¾ãã</p> 3161<p>GitHub Actionsãæå¹ã«ãªã£ã¦ããGitHubãªãã¸ããªã«Railsã¢ããªã®ã³ã¼ããããã·ã¥ããã°ãããã ãã§GitHub Actionsã§ãããã®æé ãèªåçã«å®è¡ãããé ç®ãã¨ã«æåã失æãå ±åãã¦ããã¾ãã</p> 3162<p>ããã«ãããã³ã¼ãã®å¤æ´ãç£è¦ãã¦æ¬ é¥ãåé¡ãæ¤åºãã使¥ã®å質ãçµ±ä¸çã«æ ä¿ã§ããããã«ãªãã¾ãã</p> 3163<h3 id="kamalã§productionç°å¢ã«ãããã¤ãã"><a class="anchorlink" href="#kamal%E3%81%A7production%E7%92%B0%E5%A2%83%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">22 Kamalã§productionç°å¢ã«ãããã¤ãã</a></h3> 3164<p>ãããããæ¥½ãã¿ãå§ã¾ãã¾ããã¢ããªããããã¤ãã¦ã¿ã¾ãããã</p> 3165<p>Railsã«ä»å±ãã¦ãã<a href="https://kamal-deploy.org">Kamal</a>ã¨ãããããã¤ãã¼ã«ã使ãã°ãã¢ããªã±ã¼ã·ã§ã³ããµã¼ãã¼ã«ç´æ¥ãããã¤ã§ãã¾ããKamalã¯ã¢ããªã±ã¼ã·ã§ã³ãDockerã³ã³ããã§å®è¡ãããã¦ã³ã¿ã¤ã ãªãã§ãããã¤ãã¾ãã</p> 3166<p>
3166Railsã«ã¯ãããã©ã«ãã§productionç°å¢ã«å¯¾å¿ããDockerfileãä»å±ãã¦ãããKamalã¯ããã使ã£ã¦Dockerã¤ã¡ã¼ã¸ããã«ãããã³ã³ããåãããã¢ããªã±ã¼ã·ã§ã³ã¨ãã®ãã¹ã¦ã®ä¾åé¢ä¿ã¨è¨å®ã使ãã¾ãã</p> 3167<p>ãªãããã®Dockerfileã§ã¯ãproductionç°å¢ã§ã¢ã»ããã广çã«å§ç¸®ãã¦é ä¿¡ããããã«ã<a href="https://github.com/basecamp/thruster">Thruster</a>ã使ã£ã¦ãã¾ãã</p> 3168<p>Kamalã§ãããã¤ãè¡ãã«ã¯ã以ä¸ã®ãã®ãå¿ è¦ã§ãã</p> 3169<ul> 3170<li>1GB以ä¸ã®RAMãæè¼ããUbuntu LTSãå®è¡ãããµã¼ãã¼ã 3171ãããã¤å ã®ãµã¼ãã¼ã¯ã宿çãªã»ãã¥ãªãã£ã¨ãã°ä¿®æ£ãåããããããã«ãLTSï¼é·æãµãã¼ãï¼çã®Ubuntu OSãå®è¡ãã¦ããå¿ è¦ãããã¾ããHetznerãDigitalOceanãªã©ã®ãã¹ãã£ã³ã°ãµã¼ãã¹ã§ã¯ãKamalã®å©ç¨ãããéå§ã§ãããµã¼ãã¼ãæä¾ãã¦ãã¾ãã</li> 3172<li> 3173<a href="https://hub.docker.com">Docker Hub</a>ã®ã¢ã«ã¦ã³ãã¨ã¢ã¯ã»ã¹ãã¼ã¯ã³ã 3174Docker Hubã¯ãã¢ããªã±ã¼ã·ã§ã³ã®ã¤ã¡ã¼ã¸ãä¿åãããµã¼ãã¼ã«ãã¦ã³ãã¼ããã¦å®è¡ã§ããããã«ãã¾ãã</li> 3175</ul> 3176<p>Docker Hubã§ãã¢ããªã±ã¼ã·ã§ã³ã¤ã¡ã¼ã¸ã®<a href="https://hub.docker.com/repository/create">ãªãã¸ããªã使</a>ãã¾ãããªãã¸ããªã®ååã¯ãstoreãã«ãã¦ããã¾ãã</p> 3177<p><code>config/deploy.yml</code>ãã¡ã¤ã«ãã¨ãã£ã¿ã§éãã¦ã<code>192.168.0.1</code>ããµã¼ãã¼ã®IPã¢ãã¬ã¹ã«ç½®ãæãã<code>your-user</code>ãDocker Hubã®ã¦ã¼ã¶ã¼åã«ç½®ãæãã¾ãã</p> 3178<div class="code_container"> 3179<pre class="highlight"> 3180# config/deploy.yml 3181# Name of your application. Used to uniquely configure containers. 3182service: store 3183 3184# Name of the container image. 3185image: your-user/store 3186 3187# Deploy to these servers. 3188servers: 3189 web: 3190 - 192.168.0.1 3191 3192# Credentials for your image host. 3193registry: 3194 # Specify the registry server, if you're not using Docker Hub 3195 # server: registry.digitalocean.com / ghcr.io / ... 3196 username: your-user 3197</pre> 3198</div> 3199<p><code>proxy:</code>ã»ã¯ã·ã§ã³ã§ã¯ãã¢ããªã±ã¼ã·ã§ã³ã§SSLãæå¹ã«ããããã®ãã¡ã¤ã³ã追å ã§ãã¾ããDNSã¬ã³ã¼ãããµã¼ãã¼ã確å®ã«æãã¦ãããã¨ã確èªãã¦ãã ãããKamalã¯ã<a href="https://letsencrypt.org/">LetsEncrypt</a>ãç¨ãã¦ãã¡ã¤ã³ã®SSLè¨¼ææ¸ãçºè¡ãã¾ãã</p> 3200<div class="code_container"> 3201<pre class="highlight"> 3202# config/deploy.yml 3203proxy: 3204 ssl: true 3205 host: app.example.com 3206</pre> 3207</div> 3208<p>Kamalãã¢ããªã±ã¼ã·ã§ã³ã®Dockerã¤ã¡ã¼ã¸ãããã·ã¥ã§ããããã«ãDockerã®Webãµã¤ãã§èªã¿åãã¨æ¸ãè¾¼ã¿ã®æ¨©éãæã¤<a href="https://app.docker.com/settings/personal-access-tokens/create">ã¢ã¯ã»ã¹ãã¼ã¯ã³ã使</a>ãã¾ãã</p> 3209<p>次ã«ãã¿ã¼ããã«ã§ã¢ã¯ã»ã¹ãã¼ã¯ã³ã<code>KAMAL_REGISTRY_PASSWORD</code>ç°å¢å¤æ°ã«<code>export</code>ãã¦ãKamalãã¢ã¯ã»ã¹ãã¼ã¯ã³ãå©ç¨ã§ããããã«ãã¾ãã</p> 3210<div class="code_container"> 3211<pre class="highlight"> 3212<span class="go">export KAMAL_REGISTRY_PASSWORD=your-access-token 3213</span> 3214</pre> 3215</div> 3216<p>ãµã¼ãã¼ã®ã»ããã¢ããã¨ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ãåãã¦è¡ãã¨ãã¯ã以ä¸ã®ã³ãã³ããå®è¡ãã¾ãã</p> 3217<div class="code_container"> 3218<pre class="highlight"> 3219<span class="gp">$</span><span class="w"> </span>bin/kamal setup 3220</pre> 3221</div> 3222<p>ããã§ã¨ããããã¾ã! æ°ããRailsã¢ããªã±ã¼ã·ã§ã³ãproductionç°å¢ã§åãããã«ãªãã¾ããï¼</p> 3223<p>æ°ããRailsã¢ããªã±ã¼ã·ã§ã³ãåãã¦ãããã¨ã確èªãã¦ã¿ã¾ãããããã©ã¦ã¶ã§ãµã¼ãã¼ã®IPã¢ãã¬ã¹ãå ¥åããã¨ãã¹ãã¢ãåãã¦ãããã¨ã確èªã§ããã¯ãã§ãã</p> 3224<p>以å¾ãã¢ããªã«å¤æ´ãå ãããã以ä¸ã®ã³ãã³ããå®è¡ããã ãã§productionç°å¢ã«ããã·ã¥ã§ãã¾ãã</p> 3225<div class="code_container"> 3226<pre class="highlight"> 3227<span class="gp">$</span><span class="w"> </span>bin/kamal deploy 3228</pre> 3229</div> 3230<h4 id="productionç°å¢ã§ã¦ã¼ã¶ã¼ã使ãã"><a class="anchorlink" href="#production%E7%92%B0%E5%A2%83%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">22.1 productionç°å¢ã§ã¦ã¼ã¶ã¼ã使ãã</a></h4> 3231<p>productionç°å¢ã§è£½åã®ä½æã»ç·¨éãè¡ãã«ã¯ãproductionç°å¢ã®ãã¼ã¿ãã¼ã¹ã«<code>User</code>ã®ã¬ã³ã¼ããå¿ è¦ã§ãã</p> 3232<p>以ä¸ã®Kamalã³ãã³ãã使ãã°ãproductionç°å¢ã«æ¥ç¶ãã¦Railsã³ã³ã½ã¼ã«ãéãã¾ãã</p> 3233<div class="code_container"> 3234<pre class="highlight"> 3235<span class="gp">$</span><span class="w"> </span>bin/kamal console 3236</pre> 3237</div> 3238<div class="code_container"> 3239<pre class="highlight"> 3240<span class="n">store</span><span class="p">(</span><span class="n">prod</span><span class="p">)</span><span class="o">></span> <span class="no">User</span><span class="p">.</span><span class="nf">create!</span><span class="p">(</span><span class="ss">email_address: </span><span class="s2">"[email protected]"</span><span class="p">,</span> <span class="ss">password: </span><span class="s2">"s3cr3t"</span><span class="p">,</span> <span class="ss">password_confirmation: </span><span class="s2">"s3cr3t"</span><span class="p">)</span> 3241</pre> 3242</div> 3243<p>ããã§ãå ¥åããã¡ã¼ã«ã¢ãã¬ã¹ã¨ãã¹ã¯ã¼ãã§productionç°å¢ã«ãã°ã¤ã³ãã¦ã製åã管çã§ããããã«ãªãã¾ãã</p> 3244<h4 id="solid-queueã§ããã¯ã°ã©ã¦ã³ãã¸ã§ããå¦çãã"><a class="anchorlink" href="#solid-queue%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B">22.2 Solid Queueã§ããã¯ã°ã©ã¦ã³ãã¸ã§ããå¦çãã</a></h4> 3245<p>ããã¯ã°ã©ã¦ã³ãã¸ã§ãã使ãã¨ãã¿ã¹ã¯ãããã¯ã°ã©ã¦ã³ãã§éåæçã«å¥ããã»ã¹ã§å®è¡ã§ãããããã¦ã¼ã¶ã¼ã¨ã¯ã¹ããªã¨ã³ã¹ãæãªããã«æ¸ã¿ã¾ãã</p> 3246<p>
324610,000人ã®åä¿¡è ã«å¨åº«ã¡ã¼ã«ãéä¿¡ãããã¨ãæ³åãã¦ã¿ã¾ãããã大éã®ã¡ã¼ã«éä¿¡ã«ã¯æéããããå¯è½æ§ãããããããã®ã¿ã¹ã¯ãããã¯ã°ã©ã¦ã³ãã¸ã§ãã«ä¹ãæãããã¨ã§ãRailsã¢ããªã®å¿çæ§ãç¶æã§ããããã«ãªãã¾ãã</p> 3247<p>developmentç°å¢ã®Railsã§ã¯ã<code>:async</code>ãã¥ã¼ã¢ããã¿ã§ActiveJobã®ããã¯ã°ã©ã¦ã³ãã¸ã§ããå¦çãã¾ããasyncã¢ããã¿ã¯ä¿çä¸ã®ã¸ã§ããã¡ã¢ãªã«ä¿åãã¾ãããåèµ·åããã¨ä¿çä¸ã®ã¸ã§ãã¯å¤±ããã¾ããããã¯developmentç°å¢ã«ã¯æé©ã§ãããproductionç°å¢ã«ã¯é©ãã¦ãã¾ããã</p> 3248<p>Railsã®productionç°å¢ã§ã¯ãããã¯ã°ã©ã¦ã³ãã¸ã§ããããå ç¢ã«ããããã«<code>solid_queue</code>ãå©ç¨ãã¾ããSolid Queueã¯ãã¸ã§ãããã¼ã¿ãã¼ã¹ã«ä¿åãã¦ãå¥ããã»ã¹ã§å®è¡ãã¾ãã</p> 3249<p>Solid Queueã¯ã<code>config/deploy.yml</code>ã®<code>SOLID_QUEUE_IN_PUMA: true</code>ç°å¢å¤æ°ã«ãã£ã¦ãproductionç°å¢ã§ã®Kamalãããã¤ã§æå¹ã«ãªã£ã¦ãã¾ããããã«ããã<a href="https://github.com/puma/puma">Puma</a> Webãµã¼ãã¼ã¯Solid Queueããã»ã¹ã®éå§ã¨åæ¢ãèªåçã«è¡ãã¾ãã</p> 3250<p>ã¡ã¼ã«ãAction Mailerã®<code>deliver_later</code>ã¡ã½ããã«ãã£ã¦éä¿¡ãããã¨ããããã®ã¡ã¼ã«ã¯ããã¯ã°ã©ã¦ã³ãéä¿¡ã®ããã«Active Jobã«éä¿¡ãããã®ã§ãHTTPãªã¯ã¨ã¹ããé å»¶ããã«æ¸ã¿ã¾ããproductionç°å¢ã§Solid Queueã使ãã¨ãã¡ã¼ã«ã¯ããã¯ã°ã©ã¦ã³ãã§éä¿¡ãããéä¿¡ã«å¤±æããå ´åã«èªåçã«å試è¡ãããã¸ã§ãã¯åèµ·åä¸ã§ããã¼ã¿ãã¼ã¹ã«å®å ¨ã«ä¿æããã¾ãã</p> 3251<p><img src="/railsguides/images/getting_started/background_jobs_light.jpg" alt="ããã¯ã°ã©ã¦ã³ãã¸ã§ãã®æµã" data-src="/railsguides/images/getting_started/background_jobs_light.jpg" class="lazyload" loading="lazy"></p> 3252<h3 id="ä»å¾ã®ã¹ããã"><a class="anchorlink" href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97">23 ä»å¾ã®ã¹ããã</a></h3> 3253<p>åãã¦ã®Railsã¢ããªã±ã¼ã·ã§ã³ã®æ§ç¯ããç²ãæ§ã§ããããããã¤ã®å®äºããã§ã¨ããããã¾ã!</p> 3254<p>次ã¯ã<a href="sign_up_and_settings.html">æ¼ç¿ï¼ã¦ã¼ã¶ã¼ç»é²ã»è¨å®æ©è½ã®è¿½å </a>ã«å¾ã£ã¦å¦ç¿ãç¶ãã¦ãã ããã</p> 3255<div class="info"><p>訳注ï¼Railsã¬ã¤ãã§ã¯éçºçµé¨è ãæ©ããã£ããã¢ããã§ãããããå¤ãã®ç¨èªèª¬æãçç¥ãã¦ãã¾ããèªãã§ãã¦ãé£ãããã¨æããå ´åã¯<a href="https://railstutorial.jp/">Railsãã¥ã¼ããªã¢ã«</a>ãããèªã¿ãã ããã</p></div> 3256<p>Railsããããã¯å¥ã«æ¼ããããæ¹ã¯ã以ä¸ã®ã¬ã¤ãããã²ãæ´»ç¨ãã ããã</p> 3257<ul> 3258<li><a href="active_record_basics.html">Active Recordã®åºç¤</a></li> 3259<li><a href="layouts_and_rendering.html">ã¬ã¤ã¢ã¦ãã¨ã¬ã³ããªã³ã°</a></li> 3260<li><a href="testing.html">Railsãã¹ãã£ã³ã°ã¬ã¤ã</a></li> 3261<li><a href="debugging_rails_applications.html">Railsã¢ããªã±ã¼ã·ã§ã³ã®ãããã°</a></li> 3262<li><a href="security.html">Railsã»ãã¥ãªãã£ã¬ã¤ã</a></li> 3263</ul> 3264<p>ã¢ããªã¯æ¥½ããä½ãã¾ãããï¼</p> 3265<h3 id="é¢é£ãªã³ã¯"><a class="anchorlink" href="#%E9%96%A2%E9%80%A3%E3%83%AA%E3%83%B3%E3%82%AF">24 é¢é£ãªã³ã¯</a></h3> 3266 <ul> 3267<li><a href="https://kaigionrails.org/2025/talks/takahashim/">Kaigi on Rails - Railsã¢ããªã±ã¼ã·ã§ã³éçºè ã®ããã®ããã¯ã¬ã¤ã</a></li> 3268<li><a href="https://note.com/yasslab/n/n89d6850e296d">Rails 8ã¯SQLiteã§å¤§å¹ ã«å¼·åããããåäººãæ±ãããã¬ã¼ã ã¯ã¼ã¯ã</a></li> 3269<li><a href="https://qiita.com/yui-knk/items/4b4aaf4b8dea049efe6e">Ruby on Railsã¬ã¤ãã®ããã - yui-knk</a></li> 3270<li><a href="https://speakerdeck.com/yasslab/railsguides-as-an-oss-gate">OSSå ¥éã¨ãã¦ã®Railsã¬ã¤ã (OSS Gate ã®ãç´¹ä»)</a></li> 3271<li><a href="https://toprubycompanies.info/">Top Ruby Companies (Rubyãæ´»ç¨ãã¦ããä¸å ´ä¼æ¥ã¾ã¨ããµã¤ã)</a></li> 3272<li><a href="https://rubyonrails.org/doctrine/ja">The Rails Doctrine (æ¥æ¬èªè¨³) - Ruby on Rails å ¬å¼ãµã¤ã</a></li> 3273<li><a href="https://railstutorial.jp">Ruby on Railsãã¥ã¼ããªã¢ã« - ãããã¯ãéçºã®ï¼âï¼ãå¦ã¼ã</a></li> 3274</ul> 3275 3276 3277 <p id="mdEditLink" style="font-size: 1.1428em; text-align: right;"> 3278 <a href="https://github.com/yasslab/railsguides.jp/tree/master/guides/source/ja/getting_started.md">ð GitHubã§ç·¨éãææ¡ãã</a> 3279 / 3280 <a href="https://guides.rubyonrails.org/getting_started.html">ð è±èªã§èªã</a> 3281 </p> 3282 3283 <h3 id="feedback" class="section" style="padding-top: 30px;"><a href="#feedback">ãã£ã¼ãããã¯ã«ã¤ãã¦</a></h3> 3284 <p> 3285 Railsã¬ã¤ã㯠GitHub ã® <a href="https://github.com/yasslab/railsguides.jp">yasslab/railsguides.jp</a> ã§ç®¡çã»å ¬éããã¦ããã¾ããæ¬ã¬ã¤ããèªãã§æ°ã«ãªãæç« ãééã£ãã³ã¼ããè¦ãããããæ°è»½ã« <a href="https://github.com/yasslab/railsguides.jp/pulls?q=is%3Apr">Pull Request</a> ãåºãã¦é ããã¨å¬ããã§ããPull Request ã®éãæ¹ã«ã¤ãã¦ã¯ <a href="https://github.com/yasslab/railsguides.jp#readme">GitHub ã® README</a> ããåç §ãã ããã 3286 </p> 3287 <p> 3288 åèã«ãããééããè¦ã¤ãããã<a href="/contributing_to_ruby_on_rails.html#rails%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AB%E8%B2%A2%E7%8C%AE%E3%81%99%E3%82%8B">Rails ã®ããã¥ã¡ã³ãã«è²¢ç®ãã</a>ããåèã«ããªãããã² <a href="https://rubyonrails.org/community/">Rails ã³ãã¥ããã£</a>ã«è²¢ç®ãã¦ã¿ã¦ãã ãã ð ð¨â¨ 3289 </p> 3290 <p> 3291 æ¬ã¬ã¤ãã®å質åä¸ã«åãã¦ãçãã¾ã®ãååãå¾ãããã°å¬ããã§ãã 3292 </p> 3293 <p style="text-align: right"> 3294 Railsã¬ã¤ãéå¶ãã¼ã (<a target="_blank" rel="noopener" href="https://twitter.com/RailsGuidesJP">@RailsGuidesJP</a>) 3295 </p> 3296 3297 3298 <h3 id="supporters" class="section" style="padding-top: 30px;"><a href="#supporters">æ¯æ´ã»åè³</a></h3> 3299 3300 <a href="https://railsguides.jp/sponsors"> 3301 <img class="lazyload" loading="lazy" alt="Railsã¬ã¤ãåè³ãã©ã³ - ããã¼ç»å" src="/railsguides/images/spinner.svg" data-src="/railsguides/images/sponsors_banner.webp"> 3302 </a> 3303 3304 <p style="margin: 15px auto 30px;"> 3305 Railsã¬ã¤ãã¯ä¸è¨ã®åè³ä¼æ¥ããç¶ç¶çãªæ¯æ´ãåãã¦ãã¾ãããããèå³ããã°ã<a href="https://railsguides.jp/sponsors">
3305åè³ãã©ã³</a>ããæ°è»½ã«ãåãåããããã ããã¨å¬ããã§ãã 3306 </p> 3307<div id="footer-bnrs"> 3308 <!-- åè³ä¼æ¥ä¸è¦§ã¯ sponsor.js ã«ãç§»ãã--> 3309 </div> 3310 3311 3312 3313 <!-- 3314 <div class="footer-bnr"> 3315 <div class="bnr-item" id='footer-carbonads'> 3316 <a href="https://www.carbonads.net/open-source?utm_source=railsguide&utm_medium=banner&utm_campaign=supporter" target="_blank" rel="noopener"> 3317 <img class="border lazyload" alt="Advertising For Open Source Projects | Carbon Ads" src="/railsguides/images/spinner.svg" data-src="/railsguides/images/logos/carbon.gif" loading="lazy" /> 3318 </a> 3319 </div> 3320 <div class="bnr-item" id='footer-sponsors'> 3321 <a href="https://railsguides.jp/sponsors"><img alt="åè³ãã©ã³" src="/railsguides/images/spinner.svg" data-src="/railsguides/images/logos/bnr-kyosan.gif" loading="lazy" class="lazyload" /></a> 3322 </div> 3323 </div> 3324 --> 3325 3326 <ol class="snsb" style="padding-top: 50px;"> 3327 <li style="padding-right: 8px;"><a class="github-button" href="https://github.com/yasslab/railsguides.jp" data-icon="octicon-star" data-show-count="true" aria-label="Star yasslab/railsguides.jp on GitHub">Star</a></li> 3328 <li style="padding-right: 8px;"> 3329<a href="https://b.hatena.ne.jp/entry/s/railsguides.jp" class="hatena-bookmark-button" data-hatena-bookmark-title="Ruby on Rails ã¬ã¤ãï¼ä½ç³»çã« Rails ãå¦ã¼ã" data-hatena-bookmark-layout="simple-balloon" data-hatena-bookmark-lang="ja" title="ãã®ã¨ã³ããªã¼ãã¯ã¦ãªããã¯ãã¼ã¯ã«è¿½å "><img src="https://b.st-hatena.com/images/entry-button/[email protected]" alt="ãã®ã¨ã³ããªã¼ãã¯ã¦ãªããã¯ãã¼ã¯ã«è¿½å " width="20" height="20" style="border: none;"></a>
3329<script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
3329 3330</li> 3331 <li> 3332<a class="twitter-share-button" href="https://twitter.com/intent/tweet" data-hashtags="Railsã¬ã¤ã" data-via="RailsGuidesJP" data-related="RailsGuidesJP,YassLab" lang="ja" width="80"></a>
3332<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
3332 3333</li> 3334 <li><div class="fb-like" data-href="https://railsguides.jp/" data-width="225" data-layout="button_count" data-action="like" data-share="false"></div></li> 3335 </ol> 3336 </div> 3337<!--//mainCol--> 3338 </div> 3339<!--//wrapper--> 3340 </div> 3341<!--//container--> 3342 3343 <hr class="hide"> 3344 3345 3346 3347
3347<script type="text/javascript" src="/railsguides/javascripts/jquery.min.js"></script>
3347 3348
3348<script type="text/javascript" src="/railsguides/javascripts/responsive-tables.js"></script>
3348 3349
3349<script type="text/javascript" src="/railsguides/javascripts/guides.js"></script>
3349 3350
3350<script type="text/javascript"> $(guidesIndex.bind); </script>
3350 3351
3351<script async defer src="https://buttons.github.io/buttons.js"></script>
3351 3352 </body> 3353 </div> 3354 3355 <footer> 3356 <ul class="footer-cover"> 3357 <li class="footer-contents-li"> 3358 <a href="/"><img data-src="/images/railsguides.png" loading="lazy" class="lazyload" alt="Railsã¬ã¤ã" style="width: 50%;"></a> 3359 <p style='font-size: 12px;'>Railsã¬ã¤ãã®<a href="https://github.com/yasslab/railsguides.jp/tree/master/guides/source" target="_blank" rel="noopener">ã³ã³ãã³ãé¨å</a>㯠<a href="https://creativecommons.org/licenses/by-sa/4.0/deed.ja" target="_blank" rel="noopener">CC BY-SA 4.0</a> ã«åºã¥ãã¦å ¬éããã¦ãã¾ãããRailsãããRuby on Railsãã¨ããåç§°ããªãã³ã« Rails ã®ãã´ç»å㯠DHH ã®ç»é²åæ¨ã§ããæ¬ãµã¤ãã®ãã´ç»åãªã©ã®ä¸é¨ã¯ YassLab 社ã®èä½ç©ã§ãã</p> 3360 <ul class="footer-sns-list"> 3361 <li class="footer-sns-list__item"><a href="https://twitter.com/RailsGuidesJP" target=_blank" rel="noopener"><i class="fa fa-twitter-square fa-2x" aria-hidden="true" title="Twitter"></i></a></li> 3362 <li class="footer-sns-list__item"><a href="https://www.facebook.com/yasslab.jp" target=_blank" rel="noopener"><i class="fa fa-facebook-square fa-2x" aria-hidden="true" title="Facebook"></i></a></li> 3363 <li class="footer-sns-list__item"><a href="https://github.com/yasslab/railsguides.jp" target=_blank" rel="noopener"><i class="fa fa-github-square fa-2x" aria-hidden="true" title="GitHub"></i></a></li> 3364 <li class="footer-sns-list__item"><a href="https://note.com/yasslab/m/ma5df1164c798" target=_blank" rel="noopener"><i class="fa fa-rss-square fa-2x" aria-hidden="true" title="note"></i></a></li> 3365 </ul> 3366 </li> 3367 <li class="footer-contents-li"> 3368 <h4 class="footer-h4">ãµã¼ãã¹</h4> 3369 <ul class="footer-contents-links"> 3370 <li><a href="/ebook">é»åæ¸ç±</a></li> 3371 <li><a href="/pro">Proãã©ã³</a></li> 3372 <li><a href="/sponsors">åè³ãã©ã³</a></li> 3373 </ul> 3374 </li> 3375 <li class="footer-contents-li"> 3376 <h4 class="footer-h4">éå¶ã«é¢ããæ å ±</h4> 3377 <ul class="footer-contents-links"> 3378 <li><a target="_blank" rel="noopener" href="https://yasslab.jp/ja/">éå¶ä¼ç¤¾</a></li> 3379 <li><a href="/term-of-service">å©ç¨è¦ç´</a></li> 3380 <li><a href="/policy">ç¹å®åå弿³ã«åºã¥ã表è¨</a></li> 3381 <li><a target="_blank" rel="noopener" href="https://yasslab.jp/ja/privacy">ãã©ã¤ãã·ã¼ããªã·ã¼</a></li> 3382 <li><a href="/contact">ãåãåãã</a></li> 3383 </ul> 3384 </li> 3385 </ul> 3386</footer> 3387 3388 3389
3389<script type="text/javascript"> 3390 $('select[name=verselect]').change(function() { 3391 if ($(this).val() != '') { 3392 dataLayer.push({ 3393 event: 'verselect', 3394 selectedElement: $(this).val() 3395 }); 3396 } 3397 }); 3398 </script>
3398 3399
3399<script type="text/javascript"> 3400 $('select[name=verselect]').change(function() { 3401 if ($(this).val() == '') { 3402 return false 3403 } 3404 3405 pathname = location.pathname.replace(/\/+$/, '').split('/').pop(); 3406 if( pathname.endsWith('.html')) { 3407 document.location.href = '/v' + $(this).val() + '/' + pathname; 3408 } else { 3409 document.location.href = '/v' + $(this).val() + '/'; 3410 } 3411 }); 3412 $("#guidesLogout").on("click", function (e) { 3413 $("#algolia-search").hide(); 3414 document.activeElement.blur(); 3415 $("#nav_login_menu").toggleClass("toggle"); 3416 $("#nav-sp").removeClass("toggle"); 3417 $("#guides").hide(); 3418 $("#notice-check").attr('checked', false).prop('checked', false).change(); 3419 return false; 3420 }); 3421 $("#mainNav__toggle").on("click", function (e) { 3422 $("#guides").hide(); 3423 $("#algolia-search").hide(); 3424 document.activeElement.blur(); 3425 $("#nav-sp").toggleClass("toggle"); 3426 $("#logout").toggleClass("toggle"); 3427 $("#notice-check").attr('checked', false).prop('checked', false).change(); 3428 return false; 3429 }); 3430 // ãã³ãã¼ã¬ã¼ã¡ãã¥ã¼ã§ä»ã®å ´æãã¯ãªãã¯ãããéããããã« 3431 $(document).on("click", function (e) { 3432 if (!$(e.target).closest('#nav-sp').length) { 3433 $('#nav-sp').removeClass('toggle'); 3434 } 3435 }); 3436 $("#guidesMenu").on("click", function (e) { 3437 $("#nav-sp").removeClass("toggle"); 3438 }); 3439 $(window).resize(function() { 3440 if ($(window).width() > 1087) { 3441 $("#nav > .nav").removeClass("toggle"); 3442 $("#logout").removeClass("toggle"); 3443 $("#header > div.wrapper").removeClass("extend-height"); 3444 } 3445 }); 3446 $("#search-input").keyup(function(){ 3447 var val = $(this).val(); 3448 $(".algolia-search__list").attr("href", "/v8.1" + "/search?q=" + encodeURIComponent(val)); 3449 }); 3450 3451 3452 // ä»ã®å ´æãã¯ãªãã¯ããã¨ç®æ¬¡ãéããããã« 3453 $(document).on('click', function(e) { 3454 if (!$(e.target).closest('#guides').length) { 3455 $("#guides").hide(); 3456 } 3457 //ãç¥ãããéãã 3458 if (!$(e.target).closest('.notice-section').length) { 3459 $("#notice-check").attr('checked', false).prop('checked', false).change(); 3460 } 3461 // æ¤ç´¢ãã©ã¼ã ãéãã 3462 if (!$(e.target).closest('#algolia-search').length) { 3463 $("#algolia-search").hide(); 3464 } 3465 // ãã°ã¤ã³ã¡ãã¥ã¼ãéãã 3466 if (!$(e.target).closest('.nav-login-menu-list').length) { 3467 $("#nav_login_menu").removeClass("toggle"); 3468 } 3469 }) 3470 // esc is hide of guides 3471 $(window).keydown(function(e){ 3472 if(e.keyCode === 27){ 3473 $("#guides").hide(); 3474 return false; 3475 } 3476 }); 3477 </script>
3477 3478 3479 3480
3480<script> 3481 twemoji.parse(document.body); 3482 function current_version_js() { 3483 return '8.1'; 3484 } 3485 </script>
3485 3486 </body> 3487</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.