🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

2回答

1258閲覧

勤怠アプリでどうやって条件分岐すればいいか分からない。

yoshi544

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/29 12:59

前提・実現したいこと

初めての質問で、趣旨がちゃんと伝わってなければすいません。
現在、勤怠管理アプリを開発しているのですが、
update_one_monthというアクションを行う際に
「出社、または退社のみを入力した際のデータ更新」というアクションが
実行されないように実装したいです。

発生している問題・エラーメッセージ

started_atとfinished_atがそれぞれに入力がされていない 場合は、更新させないとコード打ったのですが これが、逆に問題になってしまい。 当日の出勤データも更新できなくなってしまっています。

class AttendancesController < ApplicationController
before_action :set_user, only: [:edit_one_month, :update_one_month]
before_action :logged_in_user, only: [:update, :edit_one_month]
before_action :admin_or_correct_user, only: [:update, :edit_one_month, :update_one_month]
before_action :set_one_month, only: :edit_one_month

UPDATE_ERROR_MSG = "勤怠登録に失敗しました。やり直してください。"

def update
@user = User.find(params[:user_id])
@attendance = Attendance.find(params[:id])
# 出勤時間が未登録であるのかを判断する
if @attendance.started_at.nil?
if @attendance.update_attributes(started_at: Time.current.change(sec: 0))
flash[:info] = "おはようございます!"
else
flash[:danger] = UPDATE_ERROR_MSG
end
elsif @attendance.finished_at.nil?
if @attendance.update_attributes(finished_at: Time.current.change(sec: 0))
flash[:info] = "お疲れさまでした。"
else
flash[:danger] = UPDATE_ERROR_MSG
end
end
redirect_to @user
end

def edit_one_month
end

def update_one_month
ActiveRecord::Base.transaction do # トランザクションを開始
attendances_params.each do |id, item|
attendance = Attendance.find(id)
attendance.update_attributes!(item)
end
end
flash[:success] = "1ヶ月分の勤怠情報を更新しました。"
redirect_to user_url(date: params[:date])
rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐
flash[:danger] = "無効なデータがあった為、更新をキャンセルしました。"
redirect_to attendances_edit_one_month_user_url(date: params[:date])
end

private

# 1ヶ月分の勤怠情報 def attendances_params params.require(:user).permit(attendances: [:started_at, :finished_at, :note])[:attendances] end # before action関連 def admin_or_correct_user @user = User.find(params[:user_id]) if @user.blank? unless current_user?(@user) || current_user.admin? flash[:danger] = "編集権限がありません。" redirect_to(root_url) end end

end
ソースコード

### 試したこと 最初は、started_atが存在しない、かつfinished_atが存在しない時には 更新しないという風に書いたのですが、 そうなると、showページでの出社ボタンもバリテーションが かかってしまうという状況です。 ### 補足情報(FW/ツールのバージョンなど) Ruby On Rails Rails 5.1.7

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

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

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

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

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

yoshi544

2020/11/29 22:32

返信ありがとうございます。 帰宅したら、修正して掲載し直してみます。 ご指摘ありがとうございます。
winterboum

2020/11/30 01:58

1.controllerのcodeがactionの途中からなので最初から載せて 2. 日々の出社退社入力を受けるactionも載せて 3.年のため勤怠データのmodelも
yoshi544

2021/01/31 01:37

返信ができず大変もうしわけありませんでした。 まだteratailの使い方もよく分からず、返信できませんでした。 何とか解決できました。解決方法に記載致します。
guest

回答2

0

attendance

1def update_one_month 2 ActiveRecord::Base.transaction do # トランザクションを開始 3 attendances_params.each do |id, item| 4    '↓ここを追記しました。' 5 if item[:started_at].present? && item[:finished_at].blank? 6 flash[:danger] = "無効なデータがあった為、更新をキャンセルしました。" 7 redirect_to attendances_edit_one_month_user_url(date: params[:date]) and return 8 end 9 attendance = Attendance.find(id) 10 attendance.update_attributes!(item) 11 end 12 end 13 flash[:success] = "1ヶ月分の勤怠情報を更新しました。" 14 redirect_to user_url(date: params[:date]) 15 rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐 16 flash[:danger] = "無効なデータがあった為、更新をキャンセルしました。" 17 redirect_to attendances_edit_one_month_user_url(date: params[:date]) and return 18 end

この追記により、勤怠時間の一括更新ページにて
同日において出社時間を入れずに退社時間だけと入力して
更新をした場合の条件分岐ができました。

##お詫び
いろいろと伝わりづらい文章だったりmarkdownが理解できていなくて
申し訳ありません。
これからは使い方がうまくなるようにしていきます。
返信いただいた方々も困惑するような内容を記述してしまい
申し訳ありませんでした。

投稿2021/01/31 02:04

yoshi544

総合スコア5

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

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

0

自己解決

attendance

1def update_one_month 2 ActiveRecord::Base.transaction do # トランザクションを開始 3 attendances_params.each do |id, item| 4    '↓ここを追記しました。' 5 if item[:started_at].present? && item[:finished_at].blank? 6 flash[:danger] = "無効なデータがあった為、更新をキャンセルしました。" 7 redirect_to attendances_edit_one_month_user_url(date: params[:date]) and return 8 end 9 attendance = Attendance.find(id) 10 attendance.update_attributes!(item) 11 end 12 end 13 flash[:success] = "1ヶ月分の勤怠情報を更新しました。" 14 redirect_to user_url(date: params[:date]) 15 rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐 16 flash[:danger] = "無効なデータがあった為、更新をキャンセルしました。" 17 redirect_to attendances_edit_one_month_user_url(date: params[:date]) and return 18 end

この追記により、勤怠時間の一括更新ページにて
同日において出社時間を入れずに退社時間だけと入力して
更新をした場合の条件分岐ができました。

##お詫び
いろいろと伝わりづらい文章だったりmarkdownが理解できていなくて
申し訳ありません。
これからは使い方がうまくなるようにしていきます。
返信いただいた方々も困惑するような内容を記述してしまい
申し訳ありませんでした。

投稿2021/01/31 01:50

yoshi544

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問