はじめに
チーム開発が無事終了しました!
早い気もするし、長かった気もします😂
今回はチーム開発を振り返って、こうすれば良かったなーなど振り返ります。
個人的なメモになりますので、ご容赦ください🙇
チームビルディングについて
🌱チームメンバーは皆さん話しやすく、とても明るい雰囲気で開発を進めることができました!
土日は開発に長時間確保することが難しいという事情があり、進捗に対して常に焦りがあったと思います。
自分が進行役ということもあって、実装時間が短く済むよう予習をかなりしました。(一日5時間以上してたと思います。笑)
結果作業分担が少し偏ってしまったので、もう少し分担が均等にできていれば、細かいところにもっと時間を使えたのではないかと後悔しました。
🌱良かった点は、毎朝昨日までの進捗報告をしてマージをしていたことです。
ブランチを最新に保つことで、コンフリクトを減らすことができました。
ただ、レイアウト実装時の作業割り振りが甘く、レイアウト関連ではコンフリクトが起きてしまいました💦
🌱コメントアウトを活用できていなかった
複雑なコードなど、もっとコメントアウトを使用すれば良かったと後悔しています!
実装面について
アクションの記述方法①
例えば、show,edit,updateのアクションの最初にそれぞれ
find(params)でidを探してきて、変数に代入するという記述があったとする。
一つ一つのアクションに記述しても問題はないが、書き方を変えることで一気にコードがシンプルになるとわかった。
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文使用パターン】
def create
@item = Item.new(item_params)
if @item.save
redirect_to admin_item_path(@item)
else
render :new
end
end
【if文を使用しないパターン】
def create
@item = Item.new(item_params)
@item.save ? (redirect_to admin_item_path(@item)) : (render :new)
end
アクションの記述方法③
製造ステータスを更新した場合に、注文ステータスを更新する記述
条件分岐が難しく、かなり複雑で読みにくいコードになってしまいました💦
こんなスッキリ描けるのかと驚きました!
(order_detail_paramsは省略しています)
【記事などを参考にした記述】
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
【改善した記述】
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!はモデルにロジックが記載されているため確認します。
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
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もコンパクトな記述に改善されました!
【記事などを参考にした記述】
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
【改善した記述】
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
update_allについて
Ruby on RailsのActive Recordのメソッド
Active Recordは、データベース操作を簡単に行えるようにするための機能🌱
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
モデルの記述方法①
バリデーションで使用する正規表現について
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桁の半角数字のみ登録が可能という意味です!
詳しくはこの記事がわかりやすかったです。
他にもcustomerコントローラでも同様の処理がありましたので、紹介します。
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/ }
さいごに
まだまだありそうですが、一旦ここまでにします💦
チーム開発は一人で開発するわけではないので、信頼して任せることも、密にコミュニケーションをとり進捗確認をすることも大事です。
今回は進行役を任せていただきましたので、他の役割になった時にもその経験を活かしていけたらと思います!
これからポートフォリオ頑張るぞ〜👊