【Ruby on rails】勤怠管理システムの退勤ボタンだけ保存されない
解決したいこと
現状:勤怠管理システムの退勤ボタンが、データベースを更新した直後一回しか反応しない
目標:出勤ボタンを押したら退勤ボタンに切り替わり、退勤の時刻として保存される
発生している問題・エラー
#<ActionController::Parameters {"authenticity_token"=>"cfqOM3oTSzD-AoNTQ-C7QOsqyg2cGc2WOQB00HHpeRc6G6TAWm_aO9BcgvF8trJBkBLLyhsonS0HqoClhBJWPQ", "commit"=>"出勤", "controller"=>"attendances", "action"=>"create"} permitted: false>
pry(#<AttendancesController>)> last_attendance
=> #<Attendance:0x00007f7fd4eeb0f0
id: 5,
user_id: 1,
clock_in_at: Fri, 21 Jun 2024 10:40:00.369834000 JST +09:00,
clock_out_at: Fri, 21 Jun 2024 10:40:01.539881000 JST +09:00,
created_at: Fri, 21 Jun 2024 10:40:00.373485000 JST +09:00,
updated_at: Fri, 21 Jun 2024 10:40:01.548026000 JST +09:00>
pry(#<AttendancesController>)> @attendance
#<Attendance:0x00007f7fd4cebf20
id: nil,
user_id: 1,
clock_in_at: nil,
clock_out_at: nil,
created_at: nil,
updated_at: nil>
該当するソースコード
<%= form_for(@attendance, url: attendances_path, method: :post) do |f| %>
<% if (!@is_clocked_in && !@is_clocked_out) || (@is_clocked_in && @is_clocked_out) %>
<%= f.submit "出勤", class: "btn btn-primary" %>
<% elsif @is_clocked_in && !@is_clocked_out %>
<%= f.submit "退勤", class: "btn btn-primary" %>
<% end %>
<% end %>
<table>
<tr>
<th>出勤時刻</th>
<th>退勤時刻</th>
</tr>
<% @attendances.each do |attendance| %>
<tr>
<td><%= l attendance.clock_in_at unless attendance.clock_in_at.nil? %></td>
<td><%= l attendance.clock_out_at unless attendance.clock_out_at.nil? %></td>
</tr>
<% end %>
</table>
class AttendancesController < ApplicationController
def new
@pattern = WorkPattern.find_by(id: current_user.work_pattern_id)
@attendance = current_user.attendances.build
@attendances = current_user.attendances
@feed_items = current_user.today_feed.paginate(page: params[:page])
last_attendance = current_user.today_attendance
@is_clocked_in = clock_in?(last_attendance)
@is_clocked_out = clock_out?(last_attendance)
@latest_attendance = current_user.attendances.last
end
def create
last_attendance = current_user.today_attendance
is_clocked_in = clock_in?(last_attendance)
is_clocked_out = clock_out?(last_attendance)
#binding.pry
if (!is_clocked_in && !is_clocked_out) || (is_clocked_in && is_clocked_out)
last_attendance = current_user.attendances.build(clock_in_at: Time.zone.now)
flash[:success] = "出勤しました"
elsif is_clocked_in && !is_clocked_out
last_attendance.clock_out_at = Time.zone.now
flash[:success] = "退勤しました"
end
if last_attendance.save
redirect_to root_path
else
@feed_items = []
flash.clear
render 'attendances/new'
end
end
def edit
end
def update
end
def index
end
end
class CreateAttendances < ActiveRecord::Migration[7.0]
def change
create_table :attendances do |t|
t.integer :user_id
t.datetime :clock_in_at
t.datetime :clock_out_at
t.timestamps
end
end
end
自分で試したこと
ifの部分に問題があるのかとerbを書き換え、無理やり退勤ボタンを表示させて押してみましたが、出勤時間の部分に表示されてしまいました。