【やりたいこと】
出社・退社時間を編集する機能を追加する勉強をしています。編集する際にチェックボックスを押して編集すると翌日に退社する(24時間後)という機能を追加したいです。
【困っていること】
チェックボックスは実装できているが、翌日の時間を取得する方法や書き方を調べてもわからず押しても何も変わらない状態。
自分の考えはDateクラスのDate.tomorrowを使えばいけるのかなと思っています。
・attendances/edit.html.erb
<%= form_for(@user, url: update_attendances_path, method: :patch) do |f| %> <table class = "table-bordered table-striped table-condensed"> <thead> <tr> <th>日付</th> <th>曜日</th> <th>出社時間</th> <th>退社時間</th> <th>翌日</th> </tr> </thead> <tbody> <% @dates.each do |day| %> <%= fields_for "attendances[]", day do |af| %> <tr> <td><%= day.worked_on.to_s(:date) %></td> <td><%= %w{日 月 火 水 木 金 土}[day.worked_on.wday] %></td> <td> <% if day.worked_on > Date.today %> <%= af.time_field :started_at, :readonly => true, class: "form-control" %> <% else %> <%= af.time_field :started_at, class: "form-control" %> <% end %> </td> <td> <% if day.worked_on > Date.today %> <%= af.time_field :finished_at, :readonly => true, class: "form-control" %> <% else %> <%= af.time_field :finished_at, class: "form-control" %> <% end %> </td> <td> <% if day.worked_on > Date.today %> <% else %> <%= af.check_box :next_day, {}, "true", "false" %> <% end %> </td> </tr> <% end %> <% end %> </tbody> </table> <div class="btn-attendances-update"> <%= f.submit "更新", class: "btn btn-primary" %> <%= link_to "キャンセル", user_path(@user, params:{first_day: @first_day }), class: "btn btn-default btn-block" %> </div> <% end %>
・attedances_controller.rb
class AttendancesController < ApplicationController before_action :logged_in_user, only: :edit before_action :general_user, only: :edit before_action :hidden, only: :edit def create @user = User.find(params[:user_id]) @attendance = @user.attendances.find_by(worked_on: Date.today) if @attendance.started_at.nil? @attendance.update_attributes(started_at: current_time) flash[:info] = 'おはようございます。' elsif @attendance.finished_at.nil? @attendance.update_attributes(finished_at: current_time) flash[:info] = 'おつかれさまでした。' else flash[:danger] = 'トラブルがあり、登録出来ませんでした。' end redirect_to @user end def edit @user = User.find(params[:id]) @first_day = first_day(params[:date]) @last_day = @first_day.end_of_month @dates = user_attendances_month_date end def update @user = User.find(params[:id]) if attendances_invalid? attendances_params.each do |id, item| attendance = Attendance.find(id) attendance.update_attributes(item) end flash[:success] = '勤怠情報を更新しました。' redirect_to user_path(@user, params:{first_day: params[:date]}) if params[:next_day] == true Time.now.tomorrow end else redirect_to edit_attendances_path(@user, params[:date]) end end private def attendances_params params.permit(attendances: [:started_at, :finished_at, :note])[:attendances] end # ログインしていない一般ユーザーは勤怠編集画面を開けない def general_user @user = User.find(params[:id]) if !current_user?(@user) && !current_user.admin? redirect_to(root_url) end end # ログイン済みユーザーか確認 def logged_in_user unless logged_in? store_location flash[:danger] = "ログインしてください。" redirect_to login_url end end #管理者は勤怠編集画面の表示禁止 def hidden if current_user.admin? redirect_to(root_url) end end end
・attendances_helper
~ def attendances_invalid? attendances = true attendances_params.each do |id, item| if item[:started_at].blank? && item[:finished_at].blank? next elsif item[:started_at].blank? || item[:finished_at].blank? attendances = false flash[:danger] = "出社時間または退社時間を入力してください。" break elsif item[:started_at] > item[:finished_at] attendances = false flash[:danger] = "出社時間を退社時間より遅い時間に設定することはできません。" break end end return attendances end end
・users_controller.rb
class UsersController < ApplicationController def new @user = User.new end def show @user = User.find(params[:id]) if params[:first_day].nil? @first_day = Date.today.beginning_of_month else @first_day = Date.parse(params[:first_day]) end @last_day = @first_day.end_of_month (@first_day..@last_day).each do |day| unless @user.attendances.any? {|attendance| attendance.worked_on == day} record = @user.attendances.build(worked_on: day) record.save end end @dates = user_attendances_month_date @worked_sum = @dates.where.not(started_at: nil).count respond_to do |format| format.html format.csv do send_data render_to_string, filename: "#{@user.name}.csv", type: :csv end end end def create @user = User.new(user_params) if @user.save log_in @user flash[:success] = "ユーザーの新規作成に成功しました。" redirect_to @user else render 'new' end registered_count = import_emails redirect_to emails_path, notice: "#{registered_count}件登録しました" end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update_attributes(user_params) flash[:success] = "ユーザー情報を更新しました。" redirect_to @user else render 'edit' end end def index if params[:q] && params[:q].reject { |key, value| value.blank? }.present? @q = User.ransack(search_params, activated_true: true) @title = "検索結果" else @q = User.ransack(activated_true: true) @title = "ユーザー一覧" end @users = @q.result.paginate(page: params[:page]) end def destroy User.find(params[:id]).destroy flash[:success] = "削除しました。" redirect_to users_url end def edit_index @user = User.find(params[:id]) end def update_index @user = User.find(params[:id]) if @user.update_attributes(update_index_params) flash[:success] = "更新しました。" redirect_to users_url else render 'index' end end end
・schema.rb
create_table "attendances", force: :cascade do |t| t.date "worked_on" t.datetime "started_at" t.datetime "finished_at" t.string "note" t.integer "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "next_day", default: false t.index ["user_id"], name: "index_attendances_on_user_id" end
・show.html.erb
<tbody> <% @dates.each do |day| %> <%= fields_for "attendances[]", day do |af| %> <tr> <td><%= day.worked_on.to_s(:date) %></td> <td class="<%= css_class %>"><%= %w{日 月 火 水 木 金 土}[day.worked_on.wday] %></td> <td><%= day.started_at.to_s(:hour) if day.started_at.present? %></td> <td><%= day.started_at.floor_to(15.minutes).to_s(:min) if day.started_at.present? %></td> <td> <% if day.worked_on == Date.today && day.started_at.nil? %> <%= button_to "出社", user_attendances_path(@user), class: "btn btn-xs btn-primary" %> <% end %> </td> <td><%= day.finished_at.to_s(:hour) if day.finished_at.present? %></td> <td><%= day.finished_at.floor_to(15.minutes).to_s(:min) if day.finished_at.present? %></td> <td> <% if day.worked_on == Date.today && day.started_at.present? && day.finished_at.nil? %> <%= button_to "退社", user_attendances_path(@user), class: "btn btn-xs btn-primary" %> <% end %> </td> <td> <% if day.started_at.present? && day.finished_at.present? %> <%= working_times(day.started_at, day.finished_at) %> <% seconds = (day.finished_at - day.started_at).to_i %> <% @total_seconds = @total_seconds.to_i + seconds %> <% end %> </td> </tr> <% end %> <% end %> </tbody>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。