質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

441閲覧

railsの出退勤アプリで各ボタンを非活性判断のロジックをもっとシンプルにしたい

oeiqgfodgfhps

総合スコア35

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/01/03 14:55

編集2022/01/03 14:59

学習のためRuby on Railsで出退勤管理のアプリを作っています。
休憩入りや休憩終了時、出勤退勤時の時間を記録するアプリなのですが、下記の要件をどうプログラミングで表現すればいいのか迷っています。
要件1 出勤されていたら、出勤ボタンを非活性化
要件2 休憩を開始していたら、休憩開始ボタンを非活性化し、休憩終了ボタンを活性化する
要件3 休憩を開始していて、かつ休憩終了ボタンが押されていなかったら退勤ボタンを非活性化する。
要件4 休憩開始と終了をすでにしていて、もう一度休憩開始を実行した場合、休憩開始ボタンを非活性化して、休憩終了ボタンを活性化させる。

この機能を実現するために、下記のようなAttendance(出退勤を記録するデータベースモデル)に対するdecoratorを定義しました。

ruby

1module AttendanceDecorator 2 def work_in_button 3 button_to "出勤", attendances_work_in_path , {:disabled=> work_in != nil} 4 end 5 6 def break_in_button 7 if work_in == nil 8 button_to "休憩開始", attendances_break_in_path, {:disabled=> true } 9 elsif break_in != nil && break_out != nil && break_out < break_in # 一回休憩開始と終了を押して、休憩開始のみを押している場合 # 休憩開始していない 10 button_to "休憩開始", attendances_break_in_path, {:disabled=> true } 11 elsif break_in == nil # 休憩開始をしていない 12 button_to "休憩開始", attendances_break_in_path, {:disabled=> false } 13 elsif break_out == nil # 休憩開始しているけど休憩終了していない 14 button_to "休憩開始", attendances_break_in_path, {:disabled=> true } 15 else# 休憩開始もしていないし休憩終了もしていない 16 button_to "休憩開始", attendances_break_in_path, {:disabled=> false } 17 end 18 end 19 20 def break_out_button 21 if work_in == nil 22 button_to "休憩終了", attendances_break_out_path, {:disabled=> true } 23 elsif break_in != nil && break_out != nil && break_out < break_in # 一回休憩開始と終了を押して、休憩開始のみを押している場合 24 button_to "休憩完了", attendances_break_out_path, {:disabled=> false} 25 elsif break_in == nil # 休憩開始をしていない 26 button_to "休憩完了", attendances_break_out_path, {:disabled=> true} 27 elsif break_out != nil #休憩開始してるし、完了もしている 28 button_to "休憩完了", attendances_break_out_path, {:disabled=> true} 29 else #休憩開始してるが、完了をしていない 30 button_to "休憩完了", attendances_break_out_path, {:disabled=> false} 31 end 32 end 33 34 def work_out_button 35 if work_in == nil 36 button_to "退勤", attendances_work_out_path, {:disabled=> true } 37 elsif !break_in && break_out 38 button_to "退勤", attendances_work_out_path, {:disabled=> true } 39 else 40 button_to "退勤", attendances_work_out_path, {:disabled=> false } 41 end 42 end 43end

下記がattendancesテーブルです。

create_table "attendances", charset: "utf8mb3", force: :cascade do |t| t.datetime "work_in" t.datetime "break_in" t.datetime "break_out" t.datetime "work_out" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.bigint "user_id" t.index ["user_id"], name: "index_attendances_on_user_id" end

上記のコードは少し条件分岐が複雑でもっとシンプルに表現できないかなと思っているのですが、何かいい案はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

いろいろな視点がありますが、思いつくままに

  1. break_in_button break_out_button の構造が全く同じです。これ使えないかなぁ、、、
  2. 小手先:break_in の評価が break_in != nil && 。。。と break_in == nil があります。これ順番逆にしても影響なさそう。逆にすると

break_in != nil && 。。。 は break_in == nil ではないのだから、break_in != nil && は省略可能
3. 見た目:if ---- end は true か false かを返すだけにし、endのあとで
button_to "****", attendances_break_in_path, {:disabled=> true_or_false }
4. わかりにくくなるかも:trueを返す条件だけ or でまとめ、その結果が true か falseか、で ↑ の式

投稿2022/01/04 03:29

winterboum

総合スコア23349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問