前提・実現したいこと
user同士でお互いに予約を申請できるアプリを作成しております。
しかし、userそれぞれで予約の有無を反映させたいのですが、
予約が一つのテーブルに反映されている状況です。
つまり、user1とuser2に関係するものが、関係のないuser3にも予約のデータが表示されてしまいます。
該当のソースコード
app/controllers/reservations_controller.rb
class ReservationsController < ApplicationController before_action :logged_in_user def index @user = User.find(params[:user_id]) @reservations = Reservation.all.where("day >= ?", Date.current).where("day < ?", Date.current >> 3).order(day: :desc) end def new @user = User.find(params[:user_id]) @reservation = Reservation.new @day = params[:day] @time = params[:time] @start_time = DateTime.parse(@day + " " + @time + " " + "JST") end def show @reservation = Reservation.find(params[:id]) end def create @reservation = Reservation.new(reservation_params) if @reservation.save flash[:success] = "ビデオ通話予約しました" redirect_to reservation_path @reservation.id else render :new end end private def reservation_params params.require(:reservation).permit(:day, :time, :user_id, :from_user_id, :start_time) end end
app/helpers/reservations_helper.rb
module ReservationsHelper def times times = ["9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "15:00", "15:30", "16:00", "16:30"] end def check_reservation(reservations, day, time) result = false reservations_count = reservations.count # 取得した予約データにdayとtimeが一致する場合はtrue,一致しない場合はfalseを返す if reservations_count > 1 reservations.each do |reservation| result = reservation[:day].eql?(day.strftime("%Y-%m-%d")) && reservation[:time].eql?(time) return result if result end elsif reservations_count == 1 result = reservations[0][:day].eql?(day.strftime("%Y-%m-%d")) && reservations[0][:time].eql?(time) return result if result end return result end end
app/models/reservation.rb
class Reservation < ApplicationRecord belongs_to :user validates :user_id, presence: true validates :from_user_id, presence: true validates :day, presence: true validates :time, presence: true validates :start_time, presence: true, uniqueness: true def self.reservations_after_one_month # 今日から1ヶ月先までのデータを取得 reservations = Reservation.all.where("day >= ?", Date.current).where("day < ?", Date.current >> 1).order(day: :desc) # 配列を作成し、データを格納 # DBアクセスを減らすために必要なデータを配列にデータを入れる reservation_data = [] reservations.each do |reservation| reservations_hash = {} reservations_hash.merge!(day: reservation.day.strftime("%Y-%m-%d"), time: reservation.time) reservation_data.push(reservations_hash) end reservation_data end end
app/views/reservations/index.html.erb
<% provide(:title, "#{@user.name}さんの予約一覧") %> <section id="contact" class="contact section-bg login"> <div class="container"> <div class="row"> <div class="col-12 text-center"> <h2><%= @user.name %>さんの予約一覧</h2> <p>1ヶ月先まで予約することができます。</p> </div> <div class="col-12 mt-3"> <%= week_calendar events: @reservations do |date, reservations| %> <%= date.day %> <% end %> </div> </div> </div> </section>
app/views/simple_calendar/_week_calendar.html.erb
<div class="container"> <div class="row"> <div class="simple-calendar"> <div class="calendar-heading"> <%= link_to t('simple_calendar.previous', default: '前週'), calendar.url_for_previous_view %> <% if calendar.number_of_weeks == 1 %> <span class="calendar-title"><%= t('simple_calendar.week', default: '1週間') %></span> <% else %> <span class="calendar-title"><%= t('simple_calendar.week', default: '1週間') %></span> <% end %> <%= link_to t('simple_calendar.next', default: '翌週'), calendar.url_for_next_view %> <% reservations = Reservation.reservations_after_one_month %> </div> <table class="table table-striped"> <thead> <tr> <th>時間</th> <% date_range.slice(0, 7).each do |day| %> <th><%= t('date.abbr_day_names')[day.wday] %></th> <% end %> </tr> </thead> <tbody> <% date_range.each_slice(7) do |week| %> <tr> <td></td> <% week.each do |day| %> <%= content_tag :td, class: calendar.td_classes_for(day) do %> <% if defined?(Haml) && respond_to?(:block_is_haml?) && block_is_haml?(passed_block) %> <% capture_haml(day, sorted_events.fetch(day, []), &passed_block) %> <% else %> <% passed_block.call day, sorted_events.fetch(day, []) %> <% end %> <% end %> <% end %> </tr> <% times.each do |time| %> <tr> <td><%= time %></td> <% week.each do |day| %> <td> <% if check_reservation(reservations, day, time) || day <= Date.current || (Date.current >> 1) < day %> <%= '×' %> <% else %> <%= link_to new_reservation_path(day: day, time: time, user_id: @user.id) do %> <%= '○' %> <% end %> <% end %> </td> <% end %> </tr> <% end %> <% end %> </tbody> </table> </div> </div> </div>
試したこと
下記のリンクを参考にしながら、作成しています。
リンク
app/views/simple_calendar/_week_calendar.html.erb の42行目とapp/helpers/reservations_helper.rb あたりが怪しいなと思っております。
補足情報(FW/ツールのバージョンなど)
rubyのバージョンは2.6.7です。
必要な箇所があれば載せますのでご教授お願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/05 12:02
2021/07/05 13:38
2021/07/06 12:48
2021/07/06 13:48
2021/07/07 10:39