DeliveriesTableのコントローラー、DeliveriesControllerを作成し、
アクションとしてindex/new/createを設定します。
このことで、ドライバー選択(login画面での照会用)、コース選択画面、走行指針入力フォーム、配達登録画面が作成できる仕様です。
目次
- 1.Index/New/Create作成
- 2.Index/New/Create編集
- 3.最終完成系
1.Index/New/Create作成
rails g controller deliveries index new create
class DeliveriesController < ApplicationController
def index
end
def new
end
def create
end
end
2.Index/New/Create編集
Index
def index
@deliveries = Delivery.includes(:employee, :course).order(service_date: :desc)
end
@deliveries
→Viewで使うためのインスタンス変数
Delivery.includes(:employee, :course)
→Deliveriesテーブルに外部キーとして設定しているemployees,coursesテーブルも同時に参照。
.order(service_date: :desc)
→配達日を新しい順に並べる。
===
new(=新規作成・配達登録ページ)
def new
@delivery = Delivery.new
@employees = Employee.all
@courses = Course.all
end
@delivery = Delivery.new
→レコード上の新しいオブジェクトの作成。
このコードでRailsが「空の配達データ(Delivery)」をメモリ上に作成する。
新しいレコード作成の準備に必要な1行。
新規登録時は1件ずつ行うため、単数系deliveryを命名。
@employees = Employee.all
→ドライバーをプルダウンで選択させたいので、全従業員を取得。
@courses = Course.all
→上記と同じ
===
create newでフォームにデータが登録された後にcreateでデータを受け取る。
def create
@delivery = Delivery.new(delivery_params)
if @delivery.save
redirect_to deliveries_path, notice: "配達を登録しました。"
else
@employees = Employee.all
@courses = Course.all
render :new, status: :unprocessable_entity
end
end
@delivery = Delivery.new(delivery_params)
→フォームから送られてきた入力値(params)をもとに、新しい Delivery オブジェクトを作成。
newアクションの@deliveryとは別物。アクションが違えば命名が同じでも問題なし。
if @delivery.save
→@delivery に入っているデータをDBに保存&INSERT文発行。
Validationチェックもされる。
成功すれば true、失敗すれば false を返す。
redirect_to deliveries_path, notice: "配達を登録しました。"
→indexページにリダイレクトして一覧を表示。
else
@employees = Employee.all
@courses = Course.all
→失敗し再描画する際、
もう一度用意しないとビューが壊れる。
render :new,
→同じリクエスト内でnewを再描画する。
=フォームに入力した内容やエラーメッセージが保持される。
status: :unprocessable_entity
→HTTP 422を返す指定で、入力エラーがあったことをブラウザに伝える。
Point
@employees = Employee.all
@courses = Course.all
よりも先にrender :new,を読んでしまうと、型崩れを起こす。
準備をしてから再描画の流れ!
===
Strong Parameters(ストロングパラメータ)
コントローラーに送られてきたフォームデータのうち、安全なものだけを取り出すための仕組み。
private
def delivery_params
params.require(:delivery).permit(
:employee_id,
:course_id,
:service_date,
:started_at,
:finished_at,
:odo_start_km,
:odo_end_km
)
end
private
→この下のメソッドはコントローラーの内部専用という宣言。
このコントローラー以外では呼び出されない。
params.require(:delivery).
パラメータの中に delivery というキーが必ず存在することを確認。
なければ エラー(ActionController::ParameterMissing) を出して処理を止める。
.permit(...)
→以下、ホワイトリスト。
=つまり、ホワイトリストに無い値は、何回送られても受け取らない仕組み。
===
3.最終完成系
class DeliveriesController < ApplicationController
def index
@deliveries = Delivery.includes(:employee, :course).order(service_date: :desc)
end
def new
@delivery = Delivery.new
@employees = Employee.all
@courses = Course.all
end
def create
@delivery = Delivery.new(delivery_params)
if @delivery.save
redirect_to deliveries_path, notice: "配達を登録しました。"
else
@employees = Employee.all
@courses = Course.all
render :new, status: :unprocessable_entity
end
end
private
def delivery_params
params.require(:delivery).permit(
:employee_id,
:course_id,
:service_date,
:started_at,
:finished_at,
:odo_start_km,
:odo_end_km
)
end
end
私のオリジナルプロダクト「Logi-Balance]に関して、
要件定義書や画面遷移図等を以下のGitHub上で公開しております。
GitHub
注意
私はプログラミング学習歴1年未満の初学者です。
この記事は自身の備忘録用として掲載しております。
間違いがあるかと思いますので、今後の学習のためにコメントにご指摘を頂けますと幸いです。