○この記事の要点
「第2章 Toyアプリケーション」の途中から最後まで実施内容メモ
思ったことなどのメモ
○内容
■モデルの作成続き
(1)scaffoldジェネレータを利用したマイクロポストリソースの作成
rails generate scaffold Micropost content:text userid:integer
(2)データベースのマイグレート
rails db:migrate
ここまですると、routesファイルが更新され、マイクロポストのWebアプリケーションが動作する
(3)contentに文字数制限を設定する
app/models/micropost.rb
validates :content, length: { maximum: 140 }
(4)Micropostsとユーザの紐づけ
1.app/models/user.rb に has_many :microposts
※ユーザは複数のマイクロポストを持っている
2.app/models/micropost.rb に belongs_to :user
※マイクロポストはユーザーに所属する
Railsのconsoleでユーザーとマイクロポストの関連付けを確認するところでうまくいかなかった。
2.6.3 :009 > first_user.microposts
Micropost Load (0.3ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ? [["user_id", 1], ["LIMIT", 11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (SQLite3::SQLException: no such column: microposts.user_id: SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ?)
対処:micropostsにuser_idなんてカラムがない。ということだったので、DBのマイグレートでスペルミスってたっぽい。よく見たら、micropostsのuser_id⇒useridで作成していた。削除方法をググって再作成。。。
削除:rails destroy scaffold "Micropost"
再作成:
rails generate scaffold Micropost content:text user_id:integer
rails db:migrate
rails servere
Webアプリ起動したらエラー
ActiveRecord::PendingMigrationError
キーワードでググったら、rails db:migrate:reset しろとのこと。
実行後、rails db:migrate を実行したら
Webページが開いた!登録したユーザなどは消えた。rails db:migrate:resetで消えるらしい。あと、141文字以上のバリデーションチェックとかも消えた
Railsのconsoleでの
first_user.microposts 結果も正しく返ってきた。
■継承の階層(説明)
UserモデルとMicropostモデルはいずれも、ApplicationRecordというクラスを継承している。
UsersコントローラとMicropostsコントローラはいずれもApplicationControllerを継承している。
継承により、そのクラスファイルがよく利用する標準の機能を別途用意せずにも役割をこなしてくれる。
# モデル
class User < ApplicationRecordclass
class Micropost < ApplicationRecord
#コントローラ
class UsersController < ApplicationController
class MicropostsController < ApplicationController
■アプリケーションのデプロイ
$ git status
$ git add -A
$ git commit -m "Finish toy app"
$ git push
$ git push heroku
$ heroku run rails db:migrate
HerokuサーバでWebページが動作することを確認して終了。
■ScaffoldでWebアプリを作成した際の良い点、悪い点
良い点:簡単。雰囲気を味わえる。
悪い点:機能が少ない。セキュリティの仕組みが全くない
■感想
・スペルミスというあるあるの発生で少し時間がかかった。削除から再実行を自分で調べて実施したが、マイグレートのところで少し躓いた。マイグレートでは、バージョン管理?的なことをやっているっぽく、整合しなくなるとエラーになるようだ。
・ここにきて少しSQLを感じた。今回だと、ユーザテーブルとマイクロポストテーブルをuser_idでリレーションしているが、外部キーを設定した記憶がないが、自動で設定されている?
・最後は継承。Java時代から便利だと思っていたが、Railsでももちろん使われている。遠い将来全てが継承でコーディングしなくてよくなる未来が来る!?