らくだ🐫にもできるRailsチュートリアル|2.3(と2.4)
2.3 Micropostsリソース
2.3.1 マイクロポストを探検する
Usersリソースの時と同様にmicropostsリソースを生成する
$ rails generate scaffold Micropost content:text user_id:integer #content:text user_id:integer を持つMicropostsリソースをscaffoldで生成 ・ ・ ・ $ rails db:migrate #生成されたファイルに則りデータベースを設定するコマンド ・ ・ ・
Rails.application.routes.draw do #Micropostsリソース用のルール resources :microposts resources :users root 'users#index' end
scaffoldでMicropostsリソースを生成したのでroutesファイルが更新されている外、
controllerやviewファイルも自動生成されている
マイクロポストを作成してみる
/microposts/newにアクセスしていくつか投稿してみる
演習
CSSを知っている読者へ: 新しいマイクロポストを作成し、ブラウザのHTMLインスペクター機能を使って「Micropost was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
<p id="notice">Micropost was successfully created.</p> #↑これが↓こうなる <p id="notice"></p>
マイクロポストの作成画面で、ContentもUserも空にして作成しようとするどうなるでしょうか?
どちらも問題なく登録できてしまう(本来は良くないのでエラーになりたい)
141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaのRubyの記事にある1段落目がちょうど150文字程度ですが、どうなりますか?)
問題なく登録できてしまう(本来は良くないのでエラーになりたい)
上記の演習で作成したマイクロポストを削除してみましょう。
/micropostsの一覧表示にあるdeleteボタンを使って削除
2.3.2 マイクロポストをマイクロにする
文字数の制限
class Micropost < ApplicationRecord #データのチェック :検証するカラム名, 検証内容 validates :content, length: { maximum: 140 } end
バリデーション = 検証 設定した内容に該当しない場合、データベースに保存されずエラーになる
この場合、contentsカラムの内容が最大140文字を超えるとエラーになる
演習
先ほど2.3.1.1の演習でやったように、もう一度Contentに141文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?
エラー表示が出て投稿できなくなっている
CSSを知っている読者へ: ブラウザのHTMLインスペクター機能を使って、表示されたエラーメッセージを調べてみてください。
#エラーメッセージを表示させるためのerror_explanationというidのdivが作られている <div id="error_explanation"> #Micropostを保存する際に1つのエラーが出ています的な見出し <h2>1 error prohibited this micropost from being saved:</h2> <ul> #コンテンツが長すぎ(最大140文字だよ)的なメッセージ <li>Content is too long (maximum is 140 characters)</li> </ul> </div>
2.3.3 ユーザーはたくさんマイクロポストを持っている
class User < ApplicationRecord #「1人のuserは複数のmicropostsを持っている」と言う関連付け has_many :microposts end
「has_many」↑と↓「belongs_to」は対になっている
class Micropost < ApplicationRecord #「一つのmicropostは一人のuserにのみ属する」と言う関連付け belongs_to :user validates :content, length: { maximum: 140 } end
この関連付けをすることで
「user_idが1のmicropostsをすべて表示する」
「このmicropostの投稿者のUserページを表示する」などの動作を付けられるようになる。
rails console
#コンソールを起動「rails c」でもOK $ rails console #first_user に Userテーブルにある1番目のデータを代入 > first_user = User.first User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]] => #"ももちゃん", email: "momo@mail.com", created_at: "2019-05-11 10:00:18", updated_at: "2019-05-11 10:00:18"> #first_userのmicroposts(全て) > first_user.microposts Micropost Load (0.1ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ? [["user_id", 1], ["LIMIT", 11]] #user_idが1の投稿は2つ作ってあったので2つ表示されている => #"に ゃーん", user_id: 1, created_at: "2019-05-18 07:05:46", updated_at: "2019-05-18 07:05:46">, #"Secondにゃーん", user_id: 1, created_at: "2019-05-18 07:07:13", updated_at: "2019-05-18 07:07:13">]> #micropost に first_userの1番目のmicropostを代入 > micropost = first_user.microposts.first Micropost Load (0.2ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."id" ASC LIMIT ? [["user_id", 1], ["LIMIT", 1]] => # "にゃーん", user_id: 1, created_at: "2019-05-18 07:05:46", updated_at: "2019-05-18 07:05:46"> #micropostのuser > micropost.user => #"ももちゃん", email: "momo@mail.com", created_at: "2019-05-11 10:00:18", updated_at: "2019-05-11 10:00:18"> #コンソールの終了 > exit(もしくはctrl+d)
演習
ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。
・ ・ ・ <p> <strong>Email:</strong> <%= @user.email %> </p> <p> <strong>Microposts:</strong> #@userのmicropostsの1番目のcontentを表示 <%= @user.microposts.first.content %> #因みにらくだ🐫は最初「@user.microposts.first」にしてしまいいました。惜しい! </p> ・ ・ ・
表示できました!
(User_idが2の投稿もあるので、/users/2にもmicropostが表示されていました)
リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。
class Micropost < ApplicationRecord belongs_to :user validates :content, length: { maximum: 140 }, presence: true #本文では改行表示されているけど実際にはこういう一文なので #文字数のバリデーションの後に区切りの「,」を忘れないこと! end
リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。
class User < ApplicationRecord has_many :microposts validates :name, presence: true validates :email, presence: true #「:」を忘れずに! end
2.3.4 継承の階層
本文ママ
演習
Applicationコントローラのファイルを開き、ApplicationControllerがActionController::Baseを継承している部分のコードを探してみてください。
class ApplicationController < ActionController::Base #↑ここ protect_from_forgery with: :exception def hello render html: "hello,world!" end end
ApplicationRecordがActiveRecord::Baseを継承しているコードはどこにあるでしょうか? 先ほどの演習を参考に、探してみてください。ヒント: コントローラと本質的には同じ仕組みなので、app/modelsディレクトリ内にあるファイルを調べてみると…?)
class ApplicationRecord < ActiveRecord::Base #↑ここ self.abstract_class = true end
2.3.5 アプリケーションをデプロイする
本文ママ
また、2.3.3.1の実習内容がそのままだったので
show.html.erbに追加したMicropoft表示用のコードをコメントアウトして再push
演習
本番環境で2〜3人のユーザーを作成してみましょう。
Herokuのアプリを開いて、名前とメールを入力してボタンをクリック。
所がエラー表示!
ログを確認しろとの事なのでターミナルから確認します
$ heroku logs
・
・
・
2019-05-19T10:46:09.270406+00:00 app[web.1]: F, [2019-05-19T10:46:09.270345 #4] FATAL -- : [ac9b9900-76f4-4689-8fd7-62656c2eedde]
2019-05-19T10:46:09.270500+00:00 app[web.1]: F, [2019-05-19T10:46:09.270443 #4] FATAL -- : [ac9b9900-76f4-4689-8fd7-62656c2eedde] app/views/users/show.html.erb:15:in `_app_views_users_show_html_erb__2106187406813746292_69896532737100'
・
・
・
怪しい部分を教えてくれます。ありがたや。
そしてapp/views/users/show.html.erbの15行目と言うのが先ほどコメントアウトしたMicropoft表示用のコード
はて?コメントアウトはいかんのか?と思いつつ、削除して再push
/users/show.html.erbが無事表示されました※URLは/users/3(user_id)
2,3については動作確認のみ、エラーなしだったので省略
2.4 最後に
まとめなので省略
まとめとか感想
基本的には2.2の復習的な内容だったのでさほど詰まらず
エラーもあったけどサクっと対応できたので良かったでした。
らくだ🐫にもできるRailsチュートリアルとは
「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。
調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです