初めてのRuby on Rails ミニQ&Aサイト開発 - create, show(2)
初めてのRuby on Rails ミニQ&Aサイト開発 - 環境構築- create(2)
questions_controller.rb
class QuestionsController < ApplicationController
def index
end
def show
end
def new
@questions = Question.new
end
def create
# p params
p question_params
end
def edit
end
def update
end
def destroy
end
private
def question_params
params.require(:question).permit(:title, :name, :content)
end
end
p params, p question_params
- pメソッドはRudyでオブジェクトの情報を出力する時に使う。
p params
- HTTPから受けたパラメータをデバッグ目的で、pメソッドは、Rubyからオブジェクトの情報を出力するために使用。
p question_params
- Strong Parametersを使って特定のフィールドのみを許可するようにフィルタリングする。
question_paramsメソッド
- RailsのStrong Parameters機能を使うprivateメソッド。
- params.require(:question) : paramsオブジェクトで :questionキーを必要にし、キーがないとエラーが発生する。
- permit(:title, :name, :content) : :questionキーの中で :title, :name, :contentフィルドだけを許可する。
createアクション
class QuestionsController < ApplicationController
def new
@questions = Question.new
end
# 質問の登録
def create
# p params
# p question_params
# Questionモデルを初期化
@question = Question.new(question_params)
# QuetionモデルをDBへ保存
@question.save
# showレダイレクト
redirect_to @question
end
private
def question_params
params.require(:question).permit(:title, :name, :content)
end
end
@question = Question.new(question_params)
- question_paramsメソッドを通じてフィルタリングされたパラメータを使って新しい 'Question'を生成する。
@quesion.save
- 生成された 'Question'オブジェクトをDataBaseに保存する。
redirect_to @question
- 保存された 'Question'オブジェクトのshowアクションにリダイレクトする。
rails dbconsole
sqlite> select * from questions;
1|bbb|aaa|ccc|2024-01-03 07:07:46.884429|2024-01-03 07:07:46.884429
showアクション
class QuestionsController < ApplicationController
def show
# p params[:id]
@question = Question.find(params[:id])
p @question
end
end
Processing by QuestionsController#show as TURBO_STREAM
Parameters: {"id"=>"4"}
Question Load (0.1ms) SELECT "questions".* FROM "questions" WHERE "questions"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]]
↳ app/controllers/questions_controller.rb:7:in `show'
#<Question id: 4, name: "bbb", title: "aaa", content: "ccc", created_at: "2024-01-03 07:23:36.480568000 +0000", updated_at: "2024-01-03 07:23:36.480568000 +0000">
Rendering layout layouts/application.html.erb
Rendering questions/show.html.erb within layouts/application
Rendered questions/show.html.erb within layouts/application (Duration: 0.4ms | Allocations: 85)
Rendered layout layouts/application.html.erb (Duration: 3.3ms | Allocations: 2346)
Completed 200 OK in 7ms (Views: 4.3ms | ActiveRecord: 0.1ms | Allocations: 3858)
showアクションの実装
- QuestionsController#show アクションは params[:id]を使って Questionオブジェクトを探す。
- params[:id]に 'id'の値が渡され、IDに当たる 'Question'オブジェクトをDataBaseから検索する。
オブジェクト検索
- @question = Question.find(params[:id]) コードはDataBaseからIDが"id"に当たる 'Question'オブジェクトを探し、'@question'変数に割り当てる。
- 検索された情報はlogに出力される。
class QuestionsController < ApplicationController
def show
@question = Question.find(params[:id])
end
end
<h1>New Question</h1>
<%= form_with(model: @question) do |form| %>
<div>
<%= form.label :title %><br>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :name %><br>
<%= form.text_field :name %>
</div>
<div>
<%= form.label :content %><br>
<%= form.text_area :content %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
- <%= @question.title %>, <%= @question.name %>, <%= @question.content %>は @questionオブジェクトの title, name, content属性をレンダリングする。
- @questionオブジェクトはshowアクションでデータベースで検索され割り当てられ、そのオブジェクトの各プロパティ値はshow.html.erbビューでユーザーに表示される。
動作プロセスの要約
1) ユーザーが特定のQuestionオブジェクトの詳細ページを要求する(例:/questions/1)。
2) ルーティング システムは、このリクエストをQuestions Controllerのshowアクションにマッピングする。
3) showアクションは、params[:id]を使用して要求されたQuestionオブジェクトを探す。
4) 見つかったオブジェクトは@questionインスタンス変数に保存され、show.html.erbビューに配信する。
5) show.html.erbビューは@questionオブジェクトの各プロパティを使用して詳細情報を画面に表示する。
https://github.com/designAR/rails_board/tree/create_question_%2302
GitHub - designAR/rails_board
Contribute to designAR/rails_board development by creating an account on GitHub.
github.com