チーム開発終了

# はじめに
チーム開発が無事終了しました！
早い気もするし、長かった気もします😂
今回はチーム開発を振り返って、こうすれば良かったなーなど振り返ります。
個人的なメモになりますので、ご容赦ください🙇

# チームビルディングについて
🌱チームメンバーは皆さん話しやすく、とても明るい雰囲気で開発を進めることができました！
土日は開発に長時間確保することが難しいという事情があり、進捗に対して常に焦りがあったと思います。
自分が進行役ということもあって、実装時間が短く済むよう予習をかなりしました。（一日5時間以上してたと思います。笑）

結果作業分担が少し偏ってしまったので、もう少し分担が均等にできていれば、細かいところにもっと時間を使えたのではないかと後悔しました。

🌱良かった点は、毎朝昨日までの進捗報告をしてマージをしていたことです。
ブランチを最新に保つことで、コンフリクトを減らすことができました。
ただ、レイアウト実装時の作業割り振りが甘く、レイアウト関連ではコンフリクトが起きてしまいました💦

🌱コメントアウトを活用できていなかった
複雑なコードなど、もっとコメントアウトを使用すれば良かったと後悔しています！

# 実装面について

#### アクションの記述方法①
例えば、show,edit,updateのアクションの最初にそれぞれ
find(params)でidを探してきて、変数に代入するという記述があったとする。
一つ一つのアクションに記述しても問題はないが、書き方を変えることで一気にコードがシンプルになるとわかった。

```customers_controller.rb
class Admin::CustomersController < ApplicationController
  before_action :ensure_customer, only: [:show, :edit, :update]
  
  def show
  end

  def edit
  end

  def update
    customer.update(customer_params)
    redirect_to admin_customer_path(customer)
  end

  private
  
  def ensure_customer
    @customer = Customer.find(params[:id])
  end
end
```

#### アクションの記述方法②
条件演算子の書き方の種類
今まではifを使用した条件演算子を利用していましたが、さまざまな書き方があることを改めて認識しました。
【if文使用パターン】
```item.controller.rb
  def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to admin_item_path(@item)
    else
      render :new
    end
  end
```

【if文を使用しないパターン】
```item.controller.rb
  def create
    @item = Item.new(item_params)
    @item.save ? (redirect_to admin_item_path(@item)) : (render :new)
  end
```

#### アクションの記述方法③
製造ステータスを更新した場合に、注文ステータスを更新する記述
条件分岐が難しく、かなり複雑で読みにくいコードになってしまいました💦
こんなスッキリ描けるのかと驚きました！
（order_detail_paramsは省略しています）

【記事などを参考にした記述】
  ```order_details_controller.rb
class Admin::OrderDetailsController < ApplicationController
  
  def update
    @order_detail = OrderDetail.find(params[:id])
    @order_detail.update(order_detail_params)
    order = @order_detail.order
    if params[:order_detail][:making_status] == "manufacturing"
     order.update(status:"making")
    end

    if is_all_order_details_making_completed(order)
      order.update(status:"preparing_ship")
    end
    redirect_to request.referer
  end
  
  private

  def is_all_order_details_making_completed(order)
    order.order_details.each do |order_detail|
      if order_detail.making_status != 'finish'
        return false
      end
    end
    return true
  end
end
```

【改善した記述】
  ```order_details_controller.rb
  class Admin::OrderDetailsController < ApplicationController
  before_action :authenticate_admin!

  def update
    @order = Order.find(params[:order_id])
    @order_detail = @order.order_details.find(params[:id])
    if @order_detail.update(order_detail_params) && @order_detail.in_production?
    # もし　@order_detailがアップデートされてかつ、製造ステータスが"製作中"だったら
    @order.in_production!
    # 注文ステータスを"製作中"に変える
    elsif @order.are_all_details_completed?
    # 制作ステータスが全て"制作完了"になったら（モデルで定義したものを呼び出し)
      @order.preparing_shipment!
    # 注文ステータスを"発送準備中"に変える
    end
    redirect_to admin_order_path(@order)
  end
end
```

in_production?・in_production!・are_all_details_completed?・preparing_shipment!はモデルにロジックが記載されているため確認します。

```order_detail.rb
class OrderDetail < ApplicationRecord
  belongs_to :order
  belongs_to :item

  enum making_status: { cannot_start: 0, waiting_start: 1, in_production: 2, completed: 3 }
# enumで指定したステータスin_productionに？や！のようなRailsの命令規則に従った特殊なメソットが使用できる
end
```

```order.rb
class Order < ApplicationRecord
  belongs_to :customer
  has_many :order_details
  has_many :items, through: :order_details
  
  enum status: { waiting_deposit: 0, confirm_deposit: 1, in_production: 2, preparing_shipment: 3, shipped: 4 }
# enumで指定したステータスpreparing_shipmentに？や！のようなRailsの命令規則に従った特殊なメソットが使用できる

  def are_all_details_completed?
    (order_details.completed.count == order_details.count) ? true : false
  end
end
```

ロジックをモデルに書くとコントローラーの記述がシンプルになることはわかっているものの…実際にするのは難しいです。

#### アクションの記述方法④
割と似たような感じですが、orders_controllerもコンパクトな記述に改善されました！

【記事などを参考にした記述】
```orders_controller.rb
  def update
   	@order = Order.find(params[:id])
    @order.update(order_params)
    order_detail = OrderDetail.where(order_id: params[:id])
    if params[:order][:status] == "confirm_payment"
      order_detail.update(making_status:"waiting_manufacture")
    end
    redirect_to request.referer
  end
```

【改善した記述】
```orders_controller.rb
  def update
    if @order.update(order_params) && @order.confirm_deposit?
    # もし　@orderがアップデートされてかつ、注文ステータスが"入金確認"だったら
      @order.order_details.update_all(making_status: 1)
      # 製造ステータス全てを"製作中"に変える
    end
    redirect_to admin_order_path(@order)
  end
```

:::note info
update_allについて
Ruby on RailsのActive Recordのメソッド
Active Recordは、データベース操作を簡単に行えるようにするための機能🌱
:::

```order.rb
class Order < ApplicationRecord
  belongs_to :customer
  has_many :order_details
  has_many :items, through: :order_details

  enum status: { waiting_deposit: 0, confirm_deposit: 1, in_production: 2, preparing_shipment: 3, shipped: 4 }
# enumで指定したステータスconfirm_depositに？や！のようなRailsの命令規則に従った特殊なメソットが使用できる
end
```

#### モデルの記述方法①
バリデーションで使用する正規表現について

```address.rb
class Address < ApplicationRecord
  belongs_to :customer

  validates :postal_code, presence: true, format: { with: /\A\d{7}\z/ }
  validates :destination, presence: true
  validates :name, presence: true

end
```

format: { with: /\A\d{7}\z/ }の部分が正規表現になります。
今回の場合だと、7桁の半角数字のみ登録が可能という意味です！
詳しくはこの記事がわかりやすかったです。

https://qiita.com/jun1991/items/d4cce5cca590d7582899

他にもcustomerコントローラでも同様の処理がありましたので、紹介します。

```customer.rb
class Customer < ApplicationRecord

  validates :last_name_kana, presence: true, format: { with: /\A[ァ-ヶー－]+\z/ }
  validates :first_name_kana, presence: true, format: { with: /\A[ァ-ヶー－]+\z/ }
  validates :postal_code, presence: true, format: { with: /\A\d{7}\z/ }
  validates :telephone_number, presence: true, format: { with: /\A\d{10,11}\z/ }
end
```

カタカナ氏名：format: { with: /\A[ァ-ヶー－]+\z/ }
10桁又は11桁の半角数字：format:{ with: /\A\d{10,11}\z/ }

# さいごに
まだまだありそうですが、一旦ここまでにします💦
チーム開発は一人で開発するわけではないので、信頼して任せることも、密にコミュニケーションをとり進捗確認をすることも大事です。
今回は進行役を任せていただきましたので、他の役割になった時にもその経験を活かしていけたらと思います！

これからポートフォリオ頑張るぞ〜👊