0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コア機能】Controller/Action(DeliveriesTable)

Posted at

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年未満の初学者です。
この記事は自身の備忘録用として掲載しております。
間違いがあるかと思いますので、今後の学習のためにコメントにご指摘を頂けますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?