{"id":2902,"date":"2021-11-20T00:28:07","date_gmt":"2021-11-19T15:28:07","guid":{"rendered":"https:\/\/suzutukiblog.com\/?p=2902"},"modified":"2022-01-22T07:51:09","modified_gmt":"2022-01-21T22:51:09","slug":"rails-tutorial-6","status":"publish","type":"post","link":"https:\/\/suzutukiblog.com\/index.php\/2021\/11\/20\/rails-tutorial-6\/","title":{"rendered":"Rails-tutorial\u81ea\u5206\u7528\u307e\u3068\u3081(\u7b2c6\u7ae0 \u30e6\u30fc\u30b6\u30fc\u30e2\u30c7\u30eb\u4f5c\u6210\u3000\u4e3b\u306b\u6f14\u7fd2)"},"content":{"rendered":"<p><a href=\"https:\/\/suzutukiblog.com\/index.php\/2021\/04\/17\/rails-tutorial-5\/\">\u305d\u306e\uff15\u304b\u3089\u7d9a\u304d\u307e\u3059<\/a><\/p>\n<h3><span class=\"number\">6.1.1\u00a0<\/span>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c<\/h3>\n<pre><strong>rails generate controller Users new<\/strong><\/pre>\n<h3 class=\"heading\"><span class=\"description\">User\u30e2\u30c7\u30eb\u3092\u751f\u6210\u3059\u308b<\/span><\/h3>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong>rails generate model User name:string email:string<\/strong><\/pre>\n<\/div>\n<\/div>\n<h3 class=\"heading\"><span class=\"description\">User\u30e2\u30c7\u30eb\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3<strong><code class=\"filepath\">db\/migrate\/[timestamp]_create_users.rb<\/code><\/strong><\/span><\/h3>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">CreateUsers<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActiveRecord<\/span><span class=\"o\">::<\/span><span class=\"no\">Migration<\/span><span class=\"o\">[<\/span><span class=\"mi\">5<\/span><span class=\"o\">.<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">change<\/span>\r\n    <span class=\"n\">create_table<\/span> <span class=\"ss\">:users<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">t<\/span><span class=\"o\">|<\/span>\r\n      <span class=\"n\">t<\/span><span class=\"o\">.<\/span><span class=\"n\">string<\/span> <span class=\"ss\">:name<\/span>\r\n      <span class=\"n\">t<\/span><span class=\"o\">.<\/span><span class=\"n\">string<\/span> <span class=\"ss\">:email<\/span>\r\n<span class=\"n\">      t<\/span><span class=\"o\">.<\/span><span class=\"n\">timestamps<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<pre><strong>rails db:migrate<\/strong><\/pre>\n<h3>\u6f14\u7fd2<\/h3>\n<p>1:Rails\u306fdb\/\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4e2d\u306b\u3042\u308b<strong>schema.rb<\/strong>\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\n\u3053\u308c\u306f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u69cb\u9020 (\u30b9\u30ad\u30fc\u30de (schema) \u3068\u547c\u3073\u307e\u3059) \u3092\u8ffd\u8de1\u3059\u308b\u305f\u3081\u306b<br \/>\n\u4f7f\u308f\u308c\u307e\u3059\u3002\u3055\u3066\u3001\u74b0\u5883\u306b\u3042\u308b<strong>db\/schema.rb<\/strong>\u306e\u5185\u5bb9\u3092\u8abf\u3079\u3001\u305d\u306e\u5185\u5bb9\u3068<br \/>\n\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u3092\u6bd4\u3079\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>schema.rb\r\n<span class=\"synType\">ActiveRecord<\/span>::<span class=\"synType\">Schema<\/span>.define(<span class=\"synConstant\">version<\/span>: <span class=\"synConstant\">20170203234505<\/span>) <span class=\"synStatement\">do<\/span>\r\n\r\n  create_table <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">users<\/span><span class=\"synSpecial\">\"<\/span>, <span class=\"synConstant\">force<\/span>: <span class=\"synConstant\">:cascade<\/span> <span class=\"synStatement\">do<\/span> |<span class=\"synIdentifier\">t<\/span>|\r\n    t.string   <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">name<\/span><span class=\"synSpecial\">\"<\/span>\r\n    t.string   <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">email<\/span><span class=\"synSpecial\">\"<\/span>\r\n    t.datetime <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">created_at<\/span><span class=\"synSpecial\">\"<\/span>, <span class=\"synConstant\">null<\/span>: <span class=\"synConstant\">false<\/span>\r\n    t.datetime <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">updated_at<\/span><span class=\"synSpecial\">\"<\/span>, <span class=\"synConstant\">null<\/span>: <span class=\"synConstant\">false<\/span>\r\n  <span class=\"synStatement\">end<\/span>\r\n<span class=\"synStatement\">end<\/span>\r\n<\/strong><\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>20200203234505_create_users.rb\r\n\r\n<span class=\"synPreProc\">class<\/span> <span class=\"synType\">CreateUsers<\/span> &lt; <span class=\"synType\">ActiveRecord<\/span>::<span class=\"synType\">Migration<\/span>[<span class=\"synConstant\">5.0<\/span>]\r\n  <span class=\"synPreProc\">def<\/span> <span class=\"synIdentifier\">change<\/span>\r\n    create_table <span class=\"synConstant\">:users<\/span> <span class=\"synStatement\">do<\/span> |<span class=\"synIdentifier\">t<\/span>|\r\n      t.string <span class=\"synConstant\">:name<\/span>\r\n      t.string <span class=\"synConstant\">:email<\/span>\r\n      t.timestamps\r\n    <span class=\"synStatement\">end<\/span>\r\n  <span class=\"synPreProc\">end<\/span>\r\n<span class=\"synPreProc\">end<\/span><\/strong><\/pre>\n<p>2:\u307b\u307c\u3059\u3079\u3066\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306f\u3001\u5143\u306b\u623b\u3059\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059<br \/>\n\u5143\u306b\u623b\u3059\u3053\u3068\u3092\u300c\u30ed\u30fc\u30eb\u30d0\u30c3\u30af (rollback)\u3068\u547c\u3073\u3001<br \/>\nRails\u3067\u306fdb:rollback\u3068\u3044\u3046\u30b3\u30de\u30f3\u30c9\u3067\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<br \/>\nrails db:rollback\u4e0a\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u5f8c\u3001<strong>db\/schema.rb<\/strong>\u306e\u5185\u5bb9\u3092\u8abf\u3079\u3066\u307f\u3066\u3001<br \/>\n\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u304c\u6210\u529f\u3057\u305f\u304b\u3069\u3046\u304b\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre>Rails\u3067\u306fdb:rollback<\/pre>\n<p>\u30b3\u30de\u30f3\u30c9\u3057\u3066\u3001\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u6210\u529f\u3092\u78ba\u8a8d<\/p>\n<h3>3:\u3082\u3046\u4e00\u5ea6rails db:migrate\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3001db\/schema.rb\u306e\u5185\u5bb9\u304c\u5143\u306b\u623b\u3063\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<p><strong>rails db:migrate<\/strong><\/p>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>schema.rb\r\n\r\n<span class=\"synType\">ActiveRecord<\/span>::<span class=\"synType\">Schema<\/span>.define(<span class=\"synConstant\">version<\/span>: <span class=\"synConstant\">0<\/span>) <span class=\"synStatement\">do<\/span>\r\n\r\n<span class=\"synStatement\">end<\/span><\/strong><\/pre>\n<p>User.create\u3067\u30e2\u30c7\u30eb\u306e\u751f\u6210\u3068\u4fdd\u5b58\u3092\u540c\u6642\u306b\u304a\u3053\u306a\u3046\u65b9\u6cd5\u3082\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>User.create\u306f\u3001true\u304bfalse\u3092\u8fd4\u3059\u4ee3\u308f\u308a\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u81ea\u8eab\u3092\u8fd4\u3059<br \/>\n\u3053\u3068\u306b\u6ce8\u76ee\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n\u8fd4\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f (\u4e0a\u306e2\u3064\u76ee\u306e\u30b3\u30de\u30f3\u30c9\u306b\u3042\u308bfoo\u306e\u3088\u3046\u306b) \u5909\u6570\u306b\u4ee3\u5165\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<p><!--more--><\/p>\n<h3 id=\"\u6f14\u7fd26121\">\u6f14\u7fd26.1.2.1<\/h3>\n<h3>1:Rails\u30b3\u30f3\u30bd\u30fc\u30eb\u3092\u958b\u304d\u3001User.new\u3067User\u30af\u30e9\u30b9\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u751f\u6210\u3055\u308c\u308b\u3053\u3068\u3001\u305d\u3057\u3066\u305d\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304cApplicationRecord\u3092\u7d99\u627f\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044 (\u30d2\u30f3\u30c8: 4.4.4\u3067\u7d39\u4ecb\u3057\u305f\u30c6\u30af\u30cb\u30c3\u30af\u3092\u4f7f\u3063\u3066\u307f\u3066\u304f\u3060\u3055\u3044)\u3002<\/h3>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\"><strong>&gt;&gt; User.new\r\n=&gt; #&lt;User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil&gt;\r\n&gt;&gt; User.superclass\r\n=&gt; ApplicationRecord(abstract)<\/strong><\/pre>\n<h3 id=\"\u6f14\u7fd26122\">\u6f14\u7fd26.1.2.2<\/h3>\n<h3>\u540c\u69d8\u306b\u3057\u3066\u3001ApplicationRecord\u304cActiveRecord::Base\u3092\u7d99\u627f\u3057\u3066\u3044\u308b\u3053\u3068\u306b\u3064\u3044\u3066\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\"><strong>&gt;&gt; ApplicationRecord.superclass\r\n=&gt; ActiveRecord::Base<\/strong><\/pre>\n<h2>\u6f14\u7fd2<\/h2>\n<h3>1:user.name\u3068user.email\u304c\u3001\u3069\u3061\u3089\u3082String\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre><strong>&gt;&gt; user.name.class<\/strong>\r\n<strong>=&gt; String<\/strong>\r\n<strong>&gt;&gt; user.email.class<\/strong>\r\n<strong>=&gt; String<\/strong><\/pre>\n<h3>2:created_at\u3068updated_at\u306f\u3001\u3069\u306e\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u3057\u3087\u3046\u304b?<\/h3>\n<pre><strong>&gt;&gt; user.updated_at.class<\/strong>\r\n<strong>=&gt; ActiveSupport::TimeWithZone<\/strong>\r\n<strong>&gt;&gt; user.created_at.class<\/strong>\r\n<strong>=&gt; ActiveSupport::TimeWithZone<\/strong><\/pre>\n<h3 id=\"\u6f14\u7fd26141\">\u6f14\u7fd26.1.4.1<\/h3>\n<p>1:name\u3092\u4f7f\u3063\u3066\u30e6\u30fc\u30b6\u30fc\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u691c\u7d22\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n\u307e\u305f\u3001find_by_name\u30e1\u30bd\u30c3\u30c9\u304c\u4f7f\u3048\u308b\u3053\u3068\u3082\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044<\/p>\n<pre><strong>User.find_by(name: \"Michael Hartl\")<\/strong>\r\n<strong>User.find_by_name(1)<\/strong><\/pre>\n<p>2:\u5b9f\u7528\u7684\u306a\u76ee\u7684\u306e\u305f\u3081\u3001User.all\u306f\u307e\u308b\u3067\u914d\u5217\u306e\u3088\u3046\u306b\u6271\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u304c\u3001<br \/>\n\u5b9f\u969b\u306b\u306f\u914d\u5217\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002User.all\u3067\u751f\u6210\u3055\u308c\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u8abf\u3079\u3001<br \/>\nArray\u30af\u30e9\u30b9\u3067\u306f\u306a\u304fUser::ActiveRecord_Relation\u30af\u30e9\u30b9\u3067\u3042\u308b\u3053\u3068<br \/>\n\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre><strong>User.all.class<\/strong>\r\n<strong>=&gt; User::ActiveRecord_Relation<\/strong><\/pre>\n<p>3:User.all\u306b\u5bfe\u3057\u3066length\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3068\u3001\u305d\u306e\u9577\u3055\u3092\u6c42\u3081\u3089\u308c\u308b\u3053\u3068<br \/>\n\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\nRuby\u306e\u6027\u8cea\u3068\u3057\u3066\u3001\u305d\u306e\u30af\u30e9\u30b9\u3092\u8a73\u3057\u304f\u77e5\u3089\u306a\u304f\u3066\u3082\u306a\u3093\u3068\u306a\u304f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u3069\u3046\u6271\u3048\u3070\u826f\u3044\u304b\u308f\u304b\u308b\u3068\u3044\u3046\u6027\u8cea\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u3053\u308c\u3092\u30c0\u30c3\u30af\u30bf\u30a4\u30d4\u30f3\u30b0 (duck typing) \u3068\u547c\u3073\u3001\u3088\u304f\u6b21\u306e\u3088\u3046\u306a\u683c\u8a00<br \/>\n\u3067\u8a00\u3044\u8868\u3055\u308c\u3066\u3044\u307e\u3059\u300c\u3082\u3057\u30a2\u30d2\u30eb\u306e\u3088\u3046\u306a\u5bb9\u59ff\u3067\u3001\u30a2\u30d2\u30eb\u306e\u3088\u3046\u306b\u9cf4\u304f<br \/>\n\u306e\u3067\u3042\u308c\u3070\u3001\u305d\u308c\u306f\u3082\u3046\u30a2\u30d2\u30eb\u3060\u308d\u3046\u300d<\/p>\n<pre><strong>User.all.length<\/strong>\r\n<strong>User Load (0.2ms) SELECT \"users\".* FROM \"users\"<\/strong>\r\n<strong>=&gt; 2<\/strong><\/pre>\n<p>\u4fdd\u5b58\u3092\u884c\u308f\u305a\u306breload\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u60c5\u5831\u3092\u5143\u306b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3059\u308b\u306e\u3067\u3001\u6b21\u306e\u3088\u3046\u306b\u5909\u66f4\u304c\u53d6\u308a\u6d88\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>update_attributes\u30e1\u30bd\u30c3\u30c9\u306f\u5c5e\u6027\u306e\u30cf\u30c3\u30b7\u30e5\u3092\u53d7\u3051\u53d6\u308a\u3001<br \/>\n\u6210\u529f\u6642\u306b\u306f\u66f4\u65b0\u3068\u4fdd\u5b58\u3092\u7d9a\u3051\u3066\u540c\u6642\u306b\u884c\u3044\u307e\u3059<\/p>\n<p>\u7279\u5b9a\u306e\u5c5e\u6027\u306e\u307f\u3092\u66f4\u65b0\u3057\u305f\u3044\u5834\u5408\u306f\u3001\u6b21\u306e\u3088\u3046\u306bupdate_attribute\u3092\u4f7f\u3044\u307e\u3059\u3002\u3053\u306eupdate_attribute\u306b\u306f\u3001\u691c\u8a3c\u3092\u56de\u907f\u3059\u308b\u3068\u3044\u3063\u305f\u52b9\u679c\u3082\u3042\u308a\u307e\u3059<\/p>\n<h3 id=\"\u6f14\u7fd26151\">\u6f14\u7fd26.1.5.1<\/h3>\n<h3>1:user\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u306e\u4ee3\u5165\u3092\u4f7f\u3063\u3066name\u5c5e\u6027\u3092\u4f7f\u3063\u3066\u66f4\u65b0\u3057\u3001<br \/>\nsave\u3067\u4fdd\u5b58\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre><strong>user.name = 'suzu aki'<\/strong>\r\n<strong>user.save<\/strong><\/pre>\n<h3>2:\u4eca\u5ea6\u306fupdate_attributes\u3092\u4f7f\u3063\u3066\u3001email\u5c5e\u6027\u3092\u66f4\u65b0\u304a\u3088\u3073\u4fdd\u5b58\u3057\u3066\u307f\u3066<br \/>\n\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre><strong>user.update_attribute(:email, \"suzutuki@example.com\")<\/strong><\/pre>\n<h3>3:\u540c\u69d8\u306b\u3057\u3066\u3001\u30de\u30b8\u30c3\u30af\u30ab\u30e9\u30e0\u3067\u3042\u308bcreated_at\u3082\u76f4\u63a5\u66f4\u65b0\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<p>\u30d2\u30f3\u30c8: \u66f4\u65b0\u3059\u308b\u3068\u304d\u306f\u300c1.year.ago\u300d\u3092\u4f7f\u3046\u3068\u4fbf\u5229\u3067\u3059\u3002<br \/>\n\u3053\u308c\u306fRails\u6d41\u306e\u6642\u9593\u6307\u5b9a\u306e\uff11\u3064\u3067\u3001\u73fe\u5728\u306e\u6642\u523b\u304b\u3089\uff11\u5e74\u524d\u306e\u6642\u9593\u3092\u7b97\u51fa\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n<pre><strong>user.update_attribute(:created_at, 1.year.ago)<\/strong><\/pre>\n<p>\u691c\u8a3c(Validation) \u5b58\u5728\u6027(presence)\u306e\u691c\u8a3c\u3001\u9577\u3055(length)\u306e\u691c\u8a3c\u3001<br \/>\n\u30d5\u30a9\u30fc\u30de\u30c3\u30c8(format)\u306e\u691c\u8a3c\u3001\u4e00\u610f\u6027(uniqueness)\u306e\u691c\u8a3c\u3067\u3059<br \/>\n\u3088\u304f\u4f7f\u308f\u308c\u308b\u6700\u7d42\u691c\u8a3c\u3068\u3057\u3066\u78ba\u8a8d (confirmation)\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<p>rails test:models\u3068\u3044\u3046\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u304c\u3001<br \/>\n\u3053\u308c\u306f\u30e2\u30c7\u30eb\u306b\u95a2\u3059\u308b\u30c6\u30b9\u30c8\u3060\u3051\u3092\u8d70\u3089\u305b\u308b\u30b3\u30de\u30f3\u30c9\u3067\u3059<\/p>\n<h2>\u6f14\u7fd2<\/h2>\n<h3>1:\u30b3\u30f3\u30bd\u30fc\u30eb\u304b\u3089\u3001\u65b0\u3057\u304f\u751f\u6210\u3057\u305fuser\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u6709\u52b9(valid)\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<pre><strong>@user = User.new(name: \"Example User\",email: \"user@example.com\")<\/strong>\r\n<strong>=&gt; #&lt;User id: nil, name: \"Example User\", email: \"user@example.com\", created_at: nil, updated_at: nil&gt;<\/strong>\r\n<strong>&gt;&gt; @user.valid?<\/strong>\r\n<strong>=&gt; true<\/strong><\/pre>\n<h3>2:\u3053\u306e\u524d\u751f\u6210\u3057\u305fuser\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3082\u6709\u52b9\u3067\u3042\u308b\u304b\u3069\u3046\u304b\u3001\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<pre><strong>User.new\r\nuser.valid?<\/strong>\r\n<strong>=&gt; true<\/strong><\/pre>\n<p>\u4eca\u56de\u306e\u5834\u5408\u3001\u691c\u8a3c\u304c1\u3064\u3057\u304b\u306a\u3044\u306e\u3067\u3001\u3069\u306e\u691c\u8a3c\u304c\u5931\u6557\u3057\u305f\u304b\u308f\u304b\u308a\u307e\u3059\u3002<br \/>\n\u3057\u304b\u3057\u3001\u5931\u6557\u3057\u305f\u3068\u304d\u306b\u4f5c\u3089\u308c\u308berrors\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f7f\u3063\u3066\u78ba\u8a8d\u3059\u308c\u3070\u3001<br \/>\n\u3055\u3089\u306b\u4fbf\u5229\u3067\u3059\u3002<\/p>\n<pre><strong>&gt;&gt; user.errors.full_messages<\/strong>\r\n<strong>=&gt; [\"Name can't be blank\"]<\/strong><\/pre>\n<h3>\u6f14\u7fd2<\/h3>\n<h3>1:\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fcu\u3092\u4f5c\u6210\u3057\u3001\u4f5c\u6210\u3057\u305f\u6642\u70b9\u3067\u306f\u6709\u52b9\u3067\u306f\u306a\u3044 (invalid) \u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<p>\u306a\u305c\u6709\u52b9\u3067\u306f\u306a\u3044\u306e\u3067\u3057\u3087\u3046\u304b?\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre><strong>&gt;&gt; u = User.new<\/strong>\r\n<strong>=&gt; #&lt;User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil&gt;<\/strong>\r\n<strong>&gt;&gt; u.valid?<\/strong>\r\n<strong>=&gt; false<\/strong>\r\n<strong>&gt;&gt; u.errors.full_messages<\/strong>\r\n<strong>=&gt; [\"Name can't be blank\"]<\/strong><\/pre>\n<h3>2:u.errors.messages\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001\u30cf\u30c3\u30b7\u30e5\u5f62\u5f0f\u3067\u30a8\u30e9\u30fc\u304c\u53d6\u5f97\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<p>email\u306b\u95a2\u3059\u308b\u30a8\u30e9\u30fc\u60c5\u5831\u3060\u3051\u3092\u53d6\u5f97\u3057\u305f\u3044\u5834\u5408\u3001\u3069\u3046\u3084\u3063\u3066\u53d6\u5f97\u3059\u308c\u3070\u826f\u3044\u3067\u3057\u3087\u3046\u304b?<\/p>\n<pre><strong>&gt;&gt; u.errors.messages<\/strong>\r\n<strong>=&gt; {:name=&gt;[\"can't be blank\"], :email=&gt;[\"can't be blank\"]}<\/strong>\r\n\r\n<strong>&gt;&gt; u.errors.messages[:email]<\/strong>\r\n<strong>=&gt; [\"can't be blank\"]<\/strong><\/pre>\n<pre><strong>name\u306e\u9577\u3055\u306e\u691c\u8a3c\u306b\u5bfe\u3059\u308b\u30c6\u30b9\u30c8 red<\/strong>\r\n\r\n<strong>test\/models\/user_test.rb<\/strong>\r\n\r\n<strong>require 'test_helper'<\/strong>\r\n\r\n<strong>class UserTest &lt; ActiveSupport::TestCase<\/strong>\r\n\r\n<strong> def setup<\/strong>\r\n<strong>   @user = User.new(name: \"Example User\", email: \"user@example.com\")<\/strong>\r\n<strong> end<\/strong>\r\n<strong>.<\/strong>\r\n<strong>.<\/strong>\r\n<strong>.<\/strong>\r\n<strong> test \"name should not be too long\" do<\/strong>\r\n<strong>  @user.name = \"a\" * 51<\/strong>\r\n<strong>  assert_not @user.valid?<\/strong>\r\n<strong> end<\/strong>\r\n\r\n<strong> test \"email should not be too long\" do<\/strong>\r\n<strong>   @user.email = \"a\" * 244 + \"@example.com\"<\/strong>\r\n<strong>   assert_not @user.valid?<\/strong>\r\n<strong>  end<\/strong>\r\n<strong>end<\/strong><\/pre>\n<h2>\u6f14\u7fd2<\/h2>\n<h3>1:\u9577\u3059\u304e\u308bname\u3068email\u5c5e\u6027\u3092\u6301\u3063\u305fuser\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u751f\u6210\u3057\u3001<br \/>\n\u6709\u52b9\u3067\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<pre><strong>user = User.new(name: \"a\"*51, email: \"b\"*256)<\/strong>\r\n<strong>=&gt; #&lt;User id: nil, name: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...\", email: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...\", created_at: nil, updated_at: nil&gt;<\/strong>\r\n<strong>&gt;&gt; user.valid?<\/strong>\r\n<strong>=&gt; false<\/strong><\/pre>\n<h3>2:\u9577\u3055\u306b\u95a2\u3059\u308b\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u304c\u5931\u6557\u3057\u305f\u6642\u3001\u3069\u3093\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u304c<br \/>\n\u751f\u6210\u3055\u308c\u308b\u3067\u3057\u3087\u3046\u304b? \u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre><strong>user.errors.full_messages<\/strong>\r\n<strong>=&gt; [\"Name is too long (maximum is 50 characters)\",<\/strong>\r\n<strong>\"Email is too long (maximum is 255 characters)\"]<\/strong><\/pre>\n<p>\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306b\u5bfe\u3059\u308b\u30c6\u30b9\u30c8<br \/>\n\u3092\u884c\u3044\u307e\u3057\u3087\u3046\u3002\u3053\u306e\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u4f5c\u308b\u65b9\u6cd5\u3068\u3057\u3066\u3001\u6587\u5b57\u5217\u306e\u914d\u5217\u3092\u7c21\u5358\u306b<br \/>\n\u4f5c\u308c\u308b%w[]\u3068\u3044\u3046\u4fbf\u5229\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u77e5\u3063\u3066\u304a\u304f\u3068\u826f\u3044\u3067\u3057\u3087\u3046\u3002<\/p>\n<pre><strong>&gt;&gt; %w[foo bar baz]<\/strong>\r\n<strong>=&gt; [\"foo\", \"bar\", \"baz\"]<\/strong>\r\n<strong>&gt;&gt; addresses = %w[USER@foo.COM THE_US-ER@foo.bar.org first.last@foo.jp]<\/strong>\r\n<strong>=&gt; [\"USER@foo.COM\", \"THE_US-ER@foo.bar.org\", \"first.last@foo.jp\"]<\/strong>\r\n<strong>&gt;&gt; addresses.each do |address|<\/strong>\r\n<strong>?&gt; puts address<\/strong>\r\n<strong>&gt;&gt; end<\/strong>\r\n<strong>USER@foo.COM<\/strong>\r\n<strong>THE_US-ER@foo.bar.org<\/strong>\r\n<strong>first.last@foo.jp<\/strong><\/pre>\n<p>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306f\u6271\u3044\u304c\u96e3\u3057\u304f\u3001<br \/>\n\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u3084\u3059\u3044\u90e8\u5206\u306a\u306e\u3067\u3001<br \/>\n\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u3044\u304f\u3064\u304b\u7528\u610f\u3057\u3066\u3001<br \/>\n\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5185\u306e\u30a8\u30e9\u30fc\u3092\u691c\u77e5\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p>\u5177\u4f53\u7684\u306b\u306f\u3001user@example,com\u306e\u3088\u3046\u306a\u7121\u52b9\u306a\u30e1\u30fc\u30eb<br \/>\n\u30a2\u30c9\u30ec\u30b9\u304c\u5f3e\u304b\u308c\u308b\u3053\u3068\u3068\u3001<br \/>\nuser@example.com\u306e\u3088\u3046\u306a\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u901a\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u306a\u304c\u3089\u3001<br \/>\n\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3059 (\u3061\u306a\u307f\u306b\u4eca\u306e\u72b6\u614b\u3067\u306f\u3001<br \/>\n\u7a7a\u3067\u306a\u3044\u6587\u5b57\u5217\u306f\u3059\u3079\u3066\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u3057\u3066\u901a\u3063\u3066\u3057\u307e\u3044\u307e\u3059) \u3002<\/p>\n<p>\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u306f\u3082\u3063\u3068\u5b9f\u7528\u7684\u3067\u3001\u5805\u7262\u3067\u3042\u308b\u3053\u3068\u304c\u5b9f\u6226\u3067\u4fdd\u8a3c\u3055\u308c\u3066\u3044\u308b\u6b63\u898f\u8868\u73fe\u3092\u63a1\u7528\u3057\u307e\u3059\u3002\u3053\u308c\u304c\u3001\u305d\u306e\u6b63\u898f\u8868\u73fe\u3067\u3059\u3002<\/p>\n<p><strong>VALID_EMAIL_REGEX = \/\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z\/i<\/strong><\/p>\n<p>\u3053\u306e\u6b63\u898f\u8868\u73fe\u3092\u7406\u89e3\u3059\u308b\u305f\u3081\u306b\u3001\u304a\u624b\u9803\u306a\u30b5\u30a4\u30ba\u306b\u5206\u5272\u3057\u3066\u307e\u3068\u3081\u305f\u3088\u3002<br \/>\n\u6b63\u898f\u8868\u73fe \u610f\u5473<br \/>\n\/\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z\/i (\u5b8c\u5168\u306a\u6b63\u898f\u8868\u73fe)<\/p>\n<p>\/ \u6b63\u898f\u8868\u73fe\u306e\u958b\u59cb\u3092\u793a\u3059<br \/>\n\\A \u6587\u5b57\u5217\u306e\u5148\u982d<br \/>\n[\\w+\\-.]+ \u82f1\u6570\u5b57\u3001\u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2 (_)\u3001\u30d7\u30e9\u30b9 (+)\u3001\u30cf\u30a4\u30d5\u30f3 (-)\u3001\u30c9\u30c3\u30c8 (.) \u306e\u3044\u305a\u308c\u304b\u3092\u5c11\u306a\u304f\u3068\u30821\u6587\u5b57\u4ee5\u4e0a\u7e70\u308a\u8fd4\u3059<br \/>\n@ \u30a2\u30c3\u30c8\u30de\u30fc\u30af<br \/>\n[a-z\\d\\-.]+ \u82f1\u5c0f\u6587\u5b57\u3001\u6570\u5b57\u3001\u30cf\u30a4\u30d5\u30f3\u3001\u30c9\u30c3\u30c8\u306e\u3044\u305a\u308c\u304b\u3092\u5c11\u306a\u304f\u3068\u30821\u6587\u5b57\u4ee5\u4e0a\u7e70\u308a\u8fd4\u3059<br \/>\n\\. \u30c9\u30c3\u30c8<br \/>\n[a-z]+ \u3000\u3000\u82f1\u5c0f\u6587\u5b57\u3092\u5c11\u306a\u304f\u3068\u30821\u6587\u5b57\u4ee5\u4e0a\u7e70\u308a\u8fd4\u3059<br \/>\n\\z \u6587\u5b57\u5217\u306e\u672b\u5c3e<br \/>\n\/ \u6b63\u898f\u8868\u73fe\u306e\u7d42\u308f\u308a\u3092\u793a\u3059<br \/>\ni \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u7121\u8996\u3059\u308b\u30aa\u30d7\u30b7\u30e7\u30f3<\/p>\n<p>\u6b63\u898f\u8868\u73fe<strong>VALID_EMAIL_REGEX<\/strong>\u306f\u5b9a\u6570<\/p>\n<h2>\u6f14\u7fd2<\/h2>\n<p>1:\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30ea\u30b9\u30c8\u3068\u3001\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30ea\u30b9\u30c8\u3092Rubular<br \/>\n\u306eYour test string:\u306b\u8ee2\u8a18\u3057\u3066\u307f\u3066\u305d\u306e\u5f8c\u3001\u6b63\u898f\u8868\u73fe\u3092<br \/>\nYour regular expression:\u306b\u8ee2\u8a18\u3057\u3066\u3001\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u307f\u304c\u3059\u3079\u3066<br \/>\n\u30de\u30c3\u30c1\u3057\u3001\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u3059\u3079\u3066\u30de\u30c3\u30c1\u3057\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002<\/p>\n<p>Rubular\u3067\u78ba\u304b\u3081\u308b<\/p>\n<p>2:foo@bar..com\u306e\u3088\u3046\u306b\u30c9\u30c3\u30c8\u304c\u9023\u7d9a\u3057\u305f\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092<br \/>\n\u8a31\u5bb9\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3002<br \/>\n\u307e\u305a\u306f\u3001\u3053\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3057\u3001<br \/>\n\u3053\u308c\u306b\u3088\u3063\u3066\u30c6\u30b9\u30c8\u304c\u5931\u6557\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n\u6b21\u306b\u3001\u5c11\u3057\u8907\u96d1\u306a\u6b63\u898f\u8868\u73fe\u3092\u4f7f\u3063\u3066\u30c6\u30b9\u30c8\u304c\u30d1\u30b9\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"code lang-ruby\" data-lang=\"ruby\" data-unlink=\"\"><strong>user_test.rb\r\n\r\n<span class=\"synPreProc\">require<\/span> <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">test_helper<\/span><span class=\"synSpecial\">'<\/span>\r\n\r\n<span class=\"synPreProc\">class<\/span> <span class=\"synType\">UserTest<\/span> &lt; <span class=\"synType\">ActiveSupport<\/span>::<span class=\"synType\">TestCase<\/span>\r\n  <span class=\"synPreProc\">def<\/span> <span class=\"synIdentifier\">setup<\/span>\r\n    <span class=\"synIdentifier\">@user<\/span> = <span class=\"synType\">User<\/span>.new(<span class=\"synConstant\">name<\/span>: <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">Example User<\/span><span class=\"synSpecial\">\"<\/span>, <span class=\"synConstant\">email<\/span>: <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">user@example.com<\/span><span class=\"synSpecial\">\"<\/span>)\r\n  <span class=\"synPreProc\">end<\/span>\r\n\r\n\uff08\u4e2d\u7565\uff09\r\n\r\n  test <span class=\"synSpecial\">\"<\/span><span class=\"synConstant\">email validation should reject invalid addresses<\/span><span class=\"synSpecial\">\"<\/span> <span class=\"synStatement\">do<\/span>\r\n    invalid_addresses = <span class=\"synSpecial\">%w[<\/span><span class=\"synConstant\">user@example,com user_at_foo.org user.name@example.<\/span>\r\n<span class=\"synConstant\">                           foo@bar_baz.com foo@bar+baz.com foo@bar..com<\/span><span class=\"synSpecial\">]<\/span>\r\n    invalid_addresses.each <span class=\"synStatement\">do<\/span> |<span class=\"synIdentifier\">invalid_address<\/span>|\r\n      <span class=\"synIdentifier\">@user<\/span>.email = invalid_address\r\n      assert_not <span class=\"synIdentifier\">@user<\/span>.valid?, <span class=\"synSpecial\">\"#{<\/span>invalid_address.inspect<span class=\"synSpecial\">}<\/span><span class=\"synConstant\"> should be invalid<\/span><span class=\"synSpecial\">\"<\/span>\r\n    <span class=\"synStatement\">end<\/span>\r\n  <span class=\"synStatement\">end<\/span> \r\n<span class=\"synPreProc\">end<\/span><\/strong><\/pre>\n<h3>3:foo@bar.com\u3092Rubular\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3057\u3001<br \/>\n\u306e\u6b63\u898f\u8868\u73fe\u3092Rubular\u3067\u4f7f\u3063\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<p>\u6709\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u307f\u304c\u3059\u3079\u3066\u30de\u30c3\u30c1\u3057\u3001<br \/>\n\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u3059\u3079\u3066\u30de\u30c3\u30c1\u3057\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>Rubular\u3067\u30c6\u30b9\u30c8\u3059\u308b<\/p>\n<p>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u4e00\u610f\u6027\u3092\u5f37\u5236\u3059\u308b\u305f\u3081\u306b (\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u3057\u3066\u4f7f\u3046\u305f\u3081\u306b)\u3001<br \/>\nvalidates\u30e1\u30bd\u30c3\u30c9\u306e:unique\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u3044\u307e\u3059\u3002\u305f\u3060\u3057\u3053\u3053\u3067\u91cd\u5927\u306a\u8b66\u544a<br \/>\n\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306e\u6587\u9762\u306f\u6d41\u3057\u8aad\u307f\u305b\u305a\u3001\u5fc5\u305a\u6ce8\u610f\u6df1\u304f\u8aad\u3093\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u307e\u305a\u306f\u5c0f\u3055\u306a\u30c6\u30b9\u30c8\u304b\u3089\u66f8\u3044\u3066\u3044\u304d\u307e\u3059\u3002<br \/>\n\u30e2\u30c7\u30eb\u306e\u30c6\u30b9\u30c8\u3067\u306f\u3053\u308c\u307e\u3067\u3001\u4e3b\u306bUser.new\u3092\u4f7f\u3063\u3066\u304d\u307e\u3057\u305f\u3002<br \/>\n\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u306f\u5358\u306b\u30e1\u30e2\u30ea\u4e0a\u306bRuby\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u308b\u3060\u3051\u3067\u3059\u3002<br \/>\n\u3057\u304b\u3057\u3001\u4e00\u610f\u6027\u306e\u30c6\u30b9\u30c8\u306e\u305f\u3081\u306b\u306f\u3001\u30e1\u30e2\u30ea\u4e0a\u3060\u3051\u3067\u306f\u306a\u304f\u3001<br \/>\n\u5b9f\u969b\u306b\u30ec\u30b3\u30fc\u30c9\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u767b\u9332\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u305d\u306e\u305f\u3081\u3001\u307e\u305a\u306f\u91cd\u8907\u3057\u305f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304b\u3089\u30c6\u30b9\u30c8\u3057\u3066\u3044\u304d\u307e\u3059<\/p>\n<p>@user\u3068\u540c\u3058\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30e6\u30fc\u30b6\u30fc\u306f\u4f5c\u6210\u3067\u304d\u306a\u3044\u3053\u3068\u3092\u3001@user.dup\u3092\u4f7f\u3063\u3066\u30c6\u30b9\u30c8\u3057\u3066\u3044\u307e\u3059\u3002dup\u306f\u3001\u540c\u3058\u5c5e\u6027\u3092\u6301\u3064\u30c7\u30fc\u30bf\u3092\u8907\u88fd\u3059\u308b\u305f\u3081\u306e\u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002<br \/>\n@user\u3092\u4fdd\u5b58\u3057\u305f\u5f8c\u3067\u306f\u3001\u8907\u88fd\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u65e2\u306b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5185\u306b\u5b58\u5728\u3059\u308b\u305f\u3081\u3001\u30e6\u30fc\u30b6\u306e\u4f5c\u6210\u306f\u7121\u52b9\u306b\u306a\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\n<pre><strong>add_index :users, :email, unique: true<\/strong><\/pre>\n<p>users\u30c6\u30fc\u30d6\u30eb\u306eemail\u30ab\u30e9\u30e0\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306badd_index\u3068\u3044\u3046Rails\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58\u3055\u308c\u308b\u76f4\u524d\u306b\u3059\u3079\u3066\u306e\u6587\u5b57\u5217\u3092\u5c0f\u6587\u5b57\u306b\u5909\u63db\u3059\u308b<br \/>\n\u3068\u3044\u3046\u5bfe\u7b56\u3092\u63a1\u308a\u307e\u3059\u3002<br \/>\n\u4f8b\u3048\u3070&#8221;Foo@ExAMPle.CoM&#8221;\u3068\u3044\u3046\u6587\u5b57\u5217\u304c\u6e21\u3055\u308c\u305f\u3089\u3001<br \/>\n\u4fdd\u5b58\u3059\u308b\u76f4\u524d\u306b&#8221;foo@example.com&#8221;\u306b\u5909\u63db\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3002<br \/>\n\u3053\u308c\u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306bActive Record\u306e\u30b3\u30fc\u30eb\u30d0\u30c3\u30af (callback) \u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<p>\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u4fdd\u5b58\u3055\u308c\u308b\u6642\u70b9\u3067\u51e6\u7406\u3092\u5b9f\u884c\u3057\u305f\u3044\u306e\u3067\u3001before_save<br \/>\n\u3068\u3044\u3046\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<div class=\"heading\"><span class=\"description\">email\u5c5e\u6027\u3092\u5c0f\u6587\u5b57\u306b\u5909\u63db\u3057\u3066\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u4e00\u610f\u6027\u3092\u4fdd\u8a3c\u3059\u308b<\/span><strong><span class=\"description\"><code class=\"filepath\"><\/code><\/span><\/strong><\/div>\n<div>\u30bb\u30ad\u30e5\u30a2\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5b8c\u5168\u306a\u5b9f\u88c5\u00a0<span class=\"smallcaps\"><strong>green<\/strong><\/span><\/div>\n<div><\/div>\n<div><code class=\"filepath\">app\/models\/user.rb<\/code><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationRecord<\/span>\r\n<span class=\"hll\">  <span class=\"n\">before_save<\/span> <span class=\"p\">{<\/span> <span class=\"nb\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">email<\/span><span class=\"o\">.<\/span><span class=\"n\">downcase<\/span> <span class=\"p\">}<\/span>\r\n<\/span>  <span class=\"n\">validates<\/span> <span class=\"ss\">:name<\/span><span class=\"p\">,<\/span>  <span class=\"ss\">presence<\/span><span class=\"p\">:<\/span> <span class=\"kp\">true<\/span><span class=\"p\">,<\/span> <span class=\"ss\">length<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">maximum<\/span><span class=\"p\">:<\/span> <span class=\"mi\">50<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"no\">VALID_EMAIL_REGEX<\/span> <span class=\"o\">=<\/span> <span class=\"sr\">\/\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z\/i<\/span>\r\n  <span class=\"n\">validates<\/span> <span class=\"ss\">:email<\/span><span class=\"p\">,<\/span> <span class=\"ss\">presence<\/span><span class=\"p\">:<\/span> <span class=\"kp\">true<\/span><span class=\"p\">,<\/span> <span class=\"ss\">length<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">maximum<\/span><span class=\"p\">:<\/span> <span class=\"mi\">255<\/span> <span class=\"p\">},<\/span>\r\n                    <span class=\"nb\">format<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">with<\/span><span class=\"p\">:<\/span> <span class=\"no\">VALID_EMAIL_REGEX<\/span> <span class=\"p\">},<\/span>\r\n                    <span class=\"ss\">uniqueness<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">case_sensitive<\/span><span class=\"p\">:<\/span> <span class=\"kp\">false<\/span> <span class=\"p\">}\r\n<\/span><span class=\"n\">  has_secure_password\r\n<\/span><span class=\"hll\">  <span class=\"n\">validates<\/span> <span class=\"ss\">:password<\/span><span class=\"p\">,<\/span> <span class=\"ss\">presence<\/span><span class=\"p\">:<\/span> <span class=\"kp\">true<\/span><span class=\"p\">,<\/span> <span class=\"ss\">length<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"ss\">minimum<\/span><span class=\"p\">:<\/span> <span class=\"mi\">6<\/span> <span class=\"p\">}\r\n<\/span><\/span><\/strong><strong><span class=\"k\">end<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<h3>\u6f14\u7fd2<\/h3>\n<p>1:\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5c0f\u6587\u5b57\u306b\u3059\u308b\u30c6\u30b9\u30c8\u3092\u30ea\u30b9\u30c8<br \/>\n<strong>test\/models\/user_test.rb<\/strong>\u306b\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br \/>\n\u3061\u306a\u307f\u306b\u8ffd\u52a0\u3059\u308b\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u3067\u306f\u3001<br \/>\n\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u5024\u306b\u5408\u308f\u305b\u3066\u66f4\u65b0\u3059\u308breload\u30e1\u30bd\u30c3\u30c9\u3068\u3001<br \/>\n\u5024\u304c\u4e00\u81f4\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u78ba\u8a8d\u3059\u308bassert_equal\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059<br \/>\n\u30c6\u30b9\u30c8\u304c\u3046\u307e\u304f\u52d5\u3044\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u3082\u3001before_save\u306e\u884c\u3092<br \/>\n\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3057\u3066red\u306b\u306a\u308b\u3053\u3068,\u30b3\u30e1\u89e3\u9664\u3057\u3066green\u306b\u306a\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><strong>#before_save { self.email = email.downcase! } <\/strong><\/p>\n<p><strong>\u30c6\u30b9\u30c8\u3057\u3066\u78ba\u8a8d<\/strong><\/p>\n<p>2:\u30c6\u30b9\u30c8\u30b9\u30a4\u30fc\u30c8\u306e\u5b9f\u884c\u7d50\u679c\u3092\u78ba\u8a8d\u3057\u306a\u304c\u3089\u3001before_save\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u3092<br \/>\nemail.downcase!\u306b\u66f8\u304d\u63db\u3048\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u30d2\u30f3\u30c8: \u30e1\u30bd\u30c3\u30c9\u306e\u672b\u5c3e\u306b!\u3092<br \/>\n\u4ed8\u3051\u8db3\u3059\u3053\u3068\u306b\u3088\u308a\u3001email\u5c5e\u6027\u3092\u76f4\u63a5\u5909\u66f4\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059 (\u30ea\u30b9\u30c8 6.34)\u3002<\/p>\n<p><strong>before_save { self.email = email.downcase! }<\/strong><\/p>\n<p>\u30bb\u30ad\u30e5\u30a2\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5b9f\u88c5\u306f\u3001<strong>has_secure_password<\/strong>\u3068\u3044\u3046<br \/>\nRails\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3060\u3051\u3067\u307b\u3068\u3093\u3069\u7d42\u308f\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<pre><strong><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ApplicationRecord\r\n<\/span><span class=\"o\"> .\r\n<\/span> <span class=\"o\">.\r\n<\/span> <span class=\"o\">.\r\n<\/span> <span class=\"n\">has_secure_password<\/span> \r\n<span class=\"k\">end<\/span><\/strong><\/pre>\n<p>password_digest\u30ab\u30e9\u30e0\u7528\u306e\u9069\u5207\u306a\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u751f\u6210\u3057\u307e\u3059\u3002<br \/>\n\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u540d\u306f\u81ea\u7531\u306b\u6307\u5b9a\u3067\u304d\u307e\u3059\u304c\u3001<br \/>\n\u6b21\u306b\u793a\u3059\u3088\u3046\u306b\u3001\u672b\u5c3e\u3092to_users\u306b\u3057\u3066\u304a\u304f\u3053\u3068\u3092\u30aa\u30b9\u30b9\u30e1\u3057\u307e\u3059\u3002<br \/>\n\u3053\u3046\u3057\u3066\u304a\u304f\u3068\u3001users\u30c6\u30fc\u30d6\u30eb\u306b\u30ab\u30e9\u30e0\u3092<br \/>\n\u8ffd\u52a0\u3059\u308b\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u304cRails\u306b\u3088\u3063\u3066\u81ea\u52d5\u7684\u306b\u4f5c\u6210\u3055\u308c\u308b\u304b\u3089\u3067\u3059\u3002<br \/>\nadd_password_digest_to_users\u3068\u3044\u3046\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210<br \/>\n\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<pre><strong>rails generate migration add_password_digest_to_users <\/strong><strong>password_digest:string\r\nrails db:migrate<\/strong><\/pre>\n<div class=\"heading\"><span class=\"description\"><code>bcrypt<\/code>\u3092<code>Gemfile<\/code>\u306b\u8ffd\u52a0\u3059\u308b<code class=\"filepath\">Gemfile<\/code><\/span><\/div>\n<div class=\"code\">\n<div class=\"highlight\">\n<pre><strong><span class=\"n\">source<\/span> <span class=\"s1\">'https:\/\/rubygems.org'<\/span>\r\n\r\n<span class=\"n\">gem<\/span> <span class=\"s1\">'rails'<\/span><span class=\"p\">,<\/span>          <span class=\"s1\">'5.1.6'<\/span>\r\n<span class=\"n\">gem<\/span> <span class=\"s1\">'bcrypt'<\/span><span class=\"p\">,<\/span>         <span class=\"s1\">'3.1.12'<\/span><\/strong><\/pre>\n<\/div>\n<\/div>\n<pre><strong>bundle install<\/strong><\/pre>\n<p>\u591a\u91cd\u4ee3\u5165 (Multiple Assignment) \u3092\u4f7f\u3063\u3066\u3044\u308b\u3053\u3068\u306b\u6ce8\u76ee\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><strong>@user.password = @user.password_confirmation = &#8220;a&#8221; * 5<\/strong><\/p>\n<p>password\u3068passwordconfirmation\u306b\u5bfe\u3057\u3066\u540c\u6642\u306b\u4ee3\u5165\u3092\u3057\u3066\u3044\u307e\u3059<br \/>\n(\u3053\u306e\u30b1\u30fc\u30b9\u3067\u306f\u3001\u6587\u5b57\u5217\u306e\u4e57\u7b97\u3092\u5229\u7528\u3057\u30665\u6587\u5b57\u306e\u6587\u5b57\u5217\u3092\u4ee3\u5165\u3057\u3066\u3044\u307e\u3059)\u3002<\/p>\n<h3>\u6f14\u7fd2<\/h3>\n<h3>1:\u6709\u52b9\u306a\u540d\u524d\u3068\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3067\u3082\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u77ed\u3059\u304e\u308b\u3068user\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u6709\u52b9\u306b\u306a\u3089\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<pre><strong>&gt;&gt; user=User.new(name:\"Taro Yamada\",email:\"yamada@mail.com\",password:\"di\")<\/strong>\r\n<strong>=&gt; #&lt;User id: nil, name: \"Taro Yamada\", email: \"yamada@mail.com\", created_at: nil, updated_at: nil, password_digest: \"$2a$10$akDmag5oWlwhewcg\/7moLe1jbqdCBZM5Lttfj4laKMR...\"&gt;<\/strong>\r\n<strong>&gt;&gt; user.valid?<\/strong>\r\n<strong>User Exists (0.2ms) SELECT 1 AS one FROM \"users\" WHERE LOWER(\"users\".\"email\") = LOWER(?) LIMIT ? [[\"email\", \"yamada@mail.com\"], [\"LIMIT\", 1]]<\/strong>\r\n<strong>=&gt; false<\/strong><\/pre>\n<h3>2:\u5931\u6557\u3057\u305f\u6642\u3001\u3069\u3093\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u306a\u308b\u3067\u3057\u3087\u3046\u304b? \u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/h3>\n<pre><strong>&gt;&gt; user.errors.full_messages<\/strong>\r\n<strong>=&gt; [\"Password is too short (minimum is 6 characters)\"]<\/strong>\r\n\r\n<strong>User.create(name: \"suzutuki akina\", email: \"suzutuki@example.com\",<\/strong>\r\n<strong>?&gt; password: \"renath\", password_confirmation: \"renath\")<\/strong><\/pre>\n<h2>\u6f14\u7fd2<\/h2>\n<h3>1:\u30b3\u30f3\u30bd\u30fc\u30eb\u3092\u4e00\u5ea6\u518d\u8d77\u52d5\u3057\u3066 (user\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6d88\u53bb\u3057\u3066)\u3001\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3<br \/>\n\u3067\u4f5c\u3063\u305fuser\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u691c\u7d22\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre><strong>user = User.find_by(email: \"mhartl@example.com\")<\/strong><\/pre>\n<h3>2:\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u691c\u7d22\u3067\u304d\u305f\u3089\u3001\u540d\u524d\u3092\u65b0\u3057\u3044\u6587\u5b57\u5217\u306b\u7f6e\u304d\u63db\u3048\u3001save\u30e1\u30bd\u30c3\u30c9\u3067\u66f4\u65b0\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\u3046\u307e\u304f\u3044\u304d\u307e\u305b\u3093\u306d\u3001\u306a\u305c\u3046\u307e\u304f\u3044\u304b\u306a\u304b\u3063\u305f\u306e\u3067\u3057\u3087\u3046\u304b?<\/h3>\n<pre><strong>user.name = \"Yamada\"<\/strong>\r\n<strong>=&gt; \"Yamada\"<\/strong>\r\n<strong>&gt;&gt; user.save<\/strong><\/pre>\n<p>name\u5c5e\u6027\u3092\u5909\u66f4\u3057\u3001.save\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001\u5909\u66f4\u3057\u3066\u3044\u306a\u3044\u7b87\u6240\u3082\u5168\u3066\u4fdd\u5b58\u3092\u8981\u6c42\u3055\u308c\u308b\u3002<br \/>\n\u3059\u306a\u308f\u3061\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u30ec\u30b3\u30fc\u30c9\u306b\u4fdd\u5b58\u3059\u308b\u3053\u3068\u3092\u8981\u6c42\u3059\u308b\u305f\u3081\u3001\u30a8\u30e9\u30fc\u304c\u751f\u3058\u308b\u3002<br \/>\n\u5909\u66f4\u53ca\u3073\u4fdd\u5b58\u3092name\u5c5e\u6027\u306e\u307f\u306b\u9650\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002<\/p>\n<h3>3:\u4eca\u5ea6\u306f6.1.5\u3067\u7d39\u4ecb\u3057\u305f\u30c6\u30af\u30cb\u30c3\u30af\u3092\u4f7f\u3063\u3066\u3001user\u306e\u540d\u524d\u3092\u66f4\u65b0\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/h3>\n<pre><strong>user.update_attribute(:name, \"Yamada\")<\/strong>\r\n<strong>(0.1ms) begin transaction<\/strong>\r\n<strong>SQL (0.4ms) UPDATE \"users\" SET \"name\" = ?, \"updated_at\" = ? WHERE \"users\".\"id\" = ? [[\"name\", \"Yamada\"], [\"updated_at\", 2017-02-05 02:36:54 UTC], [\"id\", 1]]<\/strong>\r\n<strong>(10.0ms) commit transaction<\/strong>\r\n<strong>=&gt; true<\/strong><\/pre>\n<h3>6.4.1 \u672c\u7ae0\u306e\u307e\u3068\u3081<\/h3>\n<h4>1:\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u3046\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb\u3092\u4fee\u6b63\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b<\/h4>\n<h4>2:Active Record\u3092\u4f7f\u3046\u3068\u3001\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb\u3092\u4f5c\u6210\u3057\u305f\u308a\u64cd\u4f5c\u3057\u305f\u308a\u3059\u308b\u305f\u3081\u306e<br \/>\n\u591a\u6570\u306e\u30e1\u30bd\u30c3\u30c9\u304c\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u308b<\/h4>\n<h4>3:Active Record\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u3046\u3068\u3001\u30e2\u30c7\u30eb\u306b\u5bfe\u3057\u3066\u5236\u9650\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b<\/h4>\n<h4>4:\u3088\u304f\u3042\u308b\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306b\u306f\u3001\u5b58\u5728\u6027\u30fb\u9577\u3055\u30fb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306a\u3069\u304c\u3042\u308b<\/h4>\n<h4>5:\u6b63\u898f\u8868\u73fe\u306f\u8b0e\u3081\u3044\u3066\u898b\u3048\u308b\u304c\u975e\u5e38\u306b\u5f37\u529b\u3067\u3042\u308b<\/h4>\n<h4>6:\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u691c\u7d22\u52b9\u7387\u304c\u5411\u4e0a\u3059\u308b\u3002\u307e\u305f\u3001<br \/>\n\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30ec\u30d9\u30eb\u3067\u306e\u4e00\u610f\u6027\u3092\u4fdd\u8a3c\u3059\u308b\u305f\u3081\u306b\u3082\u4f7f\u308f\u308c\u308b<\/h4>\n<h4>7:has_secure_password\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3046\u3053\u3068\u3067\u3001\u30e2\u30c7\u30eb\u306b\u5bfe\u3057\u3066\u30bb\u30ad\u30e5\u30a2\u306a<br \/>\n\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b<\/h4>\n<p><a href=\"https:\/\/suzutukiblog.com\/index.php\/2021\/04\/18\/rails-tutorial-7\/\">\u305d\u306e\uff17\u306b\u7d9a\u304f<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u305d\u306e\uff15\u304b\u3089\u7d9a\u304d\u307e\u3059 6.1.1\u00a0\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c rails generate controller Users new User\u30e2\u30c7\u30eb\u3092\u751f\u6210\u3059\u308b rails generate model User name:stri [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[27,13],"tags":[],"class_list":["post-2902","post","type-post","status-publish","format-standard","hentry","category-programming-note","category-rails"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/2902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/comments?post=2902"}],"version-history":[{"count":11,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/2902\/revisions"}],"predecessor-version":[{"id":4531,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/posts\/2902\/revisions\/4531"}],"wp:attachment":[{"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/media?parent=2902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/categories?post=2902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suzutukiblog.com\/index.php\/wp-json\/wp\/v2\/tags?post=2902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}