Re:Rails 2022 QAサービス作成詳細
Documents
Work
メイン教材
補助ドキュメント
備考:
- タイプミス/間違えた時
- モデルの削除
rails destroy model answer
質問回答アプリの基盤作成
コントローラーを作成
要件
- questionsという名前で以下コントローラー作成
Issue
- なぜやるのか
- RailsはMVCモデルなので、静的な表示をするにも、何をするにもコントローラーが必要だから
- このタスクのゴール
- index show edit newのコントローラー基盤が作成されていること
実装
Commit 83530c6
モデル作成
要件
各カラムの型の設計
カラム |
型 |
name |
string |
title |
string |
content |
text |
レコードのイメージ
ID |
name |
title |
content |
1 |
山田 |
題名A |
投稿内容A |
2 |
吉岡さん |
題名B |
投稿内容BBB |
… |
… |
… |
… |
Issue
- なぜやるのか
- このタスクのゴール
- モデルquestionを作成する
- 投稿のための名前、題名、内容を保存するためのカラムを作成する
- DBが反映された事をコマンドにて確認する
実装
備考:
- モデル名先頭は大文字
Questions
で作成した方が良い
- モデル名は先頭が小文字、モデルのクラスは先頭が大文字」と区別されるので、モデル作成時に先頭を大文字/小文字のどちらでで入力しても、自動で修正される
cmmit 15e9b11
DB確認
ルーティングの設定
Issue
- なぜやるのか
- Railsの規約によるURLパス=各ページ表示の設定を行う
- このタスクのゴール
- ルーティングの設定
- URLでの表示確認
- コマンドでのURLパス設定確認
rails routes
routes変更
一括で基本的なルーティングを設定してくれる
rails routes
ルート設定
commit 0de96f9
Bootstrap4の導入
Issue
- なぜやるのか
- このタスクのゴール
- Bootstrapの設定
- ブラウザのソース表示での反映の確認
- CSSクラス付与の反映テスト
Gemfile
bundle
- CSS to SCSS
application.css -> application.scss
- application.js
app/views/layouts/application.html.erb
- Bootstrapのラッピングスタイル、最大幅の調整
commit 1cc1e21
indexリストの表示UI + Seedでダミーデータ流し込み
コントローラーアクション
- app/controllers/questions_controller.rb
@questions
=インスタンス変数に、Question
モデル内全てのータを取得し、格納する
確認方法
データを入れたタイミングでターミナルでrails c
> Question.all
にて確認出来る
データのView化 リスト表示基盤作成
ポイント
で作成したインスタンス変数でfor文を作成し、ここで一時的に作成した変数qs
にモデルのカラム名を当てていく
ダミーデータの作成
- DBが無い表示確認が出来ないため、一旦ダミーデータを入れておく
- UIとしての静的なHTMLでも良いが、DBがの反映テストとしてもシードの活用が望ましい
- ダミー参考
db/seeds.rb
シードの反映
rails db:seed
確認
Point
DBまわりではまったら、DBを作り直す(モデル自体はそのまま)
commit c57fcb8 e4a3111
現UI

新規投稿画面の作成
- issue
- 現在のままだとユーザーが新規にデータを入れられないので、入力出来るインターフェースが必要
- ゴール
- 入力UIを通して、ユーザーがデータを追加出来るようにする
- How
- new.htmnl.erbに入力可能なUIを設置する
- コントローラーのnewにデータ投入のコードを設定
- ストロングパラメータでセキュアにする
HTML
- eachでループをまわす。
form_with
model:
@question
- モデル:(モデルは) コントローラーで設定した、@モデルオブジェクトを設置
local: true
- 取得したプロパティに対して
do |f|
eachをまわす、変数をf
にする。 jsのmapと同じような働きをする
f.text_field
Railsのフォーム機能。
参考:
【Rails】form_forの基本の基 - Qiita
コントローラ
new
@question = Question.new
新規作成メソッドにてインスタンスでに格納し、@オブジェクトを作成する
create
@question = Question.new(questions_params)
- if @question.save 保存すれば
- redirect_to root_path リダイレクト
- notice: "Succusess!" 成功表示
- else 失敗時
- flash[:alert] = "Save Error" フラッシュ表示
- render :new レンダーでnew 入力状態に戻す
- params.require(:question).permit(:name, :title, :content)
byebugでデバッグ
フォーム送信直前に設置
ターミナルでデバッグ
再起動後、newのフォームHTMLのトークンが一致しているか確認

commit f632402
バリデート
未入力だと送信出来ないようにする
app/models/question.rb
共通HTML
該当コントローラー
commit 1a08adf
リンクの作成
パスの確認
HTMLに設置
- フォームヘルパーを使ったリンクの作成
xxx_path
でRailsルールにのっとり、リンクの自動作成
- editは
_path(パラメーター)
で自動的に書くレコードのオブジェクトを取得し、idも紐付いてリンクが生成される
commit 1697191
編集画面の作成
- 新規作成とほぼ同じUIなので、newから一旦コピペ
- コントローラーで
edit/create
を作成する
- 基本的にはnewと同じ仕組み
- updateが反映されてDBが上書きされる
メモ
- form_withで作られたフォームに入力された情報は、create アクションかupdate アクションかの
どちらかに送信される
- 今回は作成済のモデルを扱っているため、saveボタンによってupdateアクションが呼ばれている。
- もし新規に作成する場合はsaveをトリガーにcreateアクションが呼ばれる
commit e67819c
HTML共通化
Sassやwordpressのように複数回使われるHTMLはパーシャルを作成する
_form.html.erb
各HTML
commit 108bf0e
削除機能
コントローラー
commit dbf5021
HTML
詳細画面
Controller
HTML
commit 7b1576e
コメント機能の作成
Answers
コントローラーの作成
rails g controller answers edit
モデルの作成
生成ファイル
app/models/answer.rb
belongs_to = 所属元、紐付け元
db/migrate/20220115071500_create_answers.rb
app/models/question.rb
- 1対多の設定
- 1つのQ(name,title,コンテンツ)に複数のA(投稿者名とコンテンツの1セット)
- 紐付け元のDB削除に関連answerも削除する。親の道連れ
反映
rails db:migrate
ルーティング
結果/ question同様にanswersにも反映
Answerコントローラーの設定
コントローラー設定 question
HTML
- 配列で2つのインスタンスを渡す
<%= form_with model: [@question, @answer]...
- hiddenで回答のFKをトリガーにしたFKのValueを渡す = 見えないがHTMLには出てくる値
<%= f.hidden_field :question_id, {value: @question.id } %>``
commit f5f92b7
新規回答投稿のコントローラー answer
- questionのインスタンス内容は、FK
question_id
- Answeの新規
@answer = Answer.new
- 保存処理
if @answer.update(answer_params)
- リダイレクト 保存処理してその場で再表示その場
redirect_to question_path(@question), notice: "Success!"
バリデート
未回答保存の防止
commit ab60417
回答一覧表示
- how many で設定していたanswersをトリガーにeachする
@question.answers.each do |answer| %>
commit 98c49a8
編集
- コントローラ
- 質問インスタンスに回答のFKにから探して投入
- 回答インスタンスに質問インスタンスの中の回答オブジェクトのIDを探して入れる
- 回答インスタンスをアップデート
show html = newと同じ
commit 8dae309
削除
HTML
controller
commit 044f623
next
リファクタリング
https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/learn/lecture/12235586#questions/6616350