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

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

詳細はこちら
Ruby on Rails 5

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

Q&A

解決済

1回答

339閲覧

条件がelseであれば全てupdateしない方法を教えてください

zoff77

総合スコア19

Ruby on Rails 5

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

0グッド

0クリップ

投稿2021/03/19 04:10

編集2021/03/19 08:57

パラメーターを配列にして、指定した件数をupdateする処理で詰まっています。

◎ やりたいこと:予定件数が予約可能件数を上回れば全てエラーとなり、updateしない。
(その際入力した値は保持)

◎現状:エラーは出るが、予約可能件数分は登録されてしまう(予約可能件数が2として、3予約した場合2件はupdateされてしまう)

お手数おかけしますが、達成方法を教えて頂けないでしょうか。

before_action :set_one_month, only: [:edit,:update] def update @user = User.find(current_user.id) @booking = @user.bookings.where.not(start: nil).where(date: @first_day..@last_day)    #⬆︎予約申請日を1か月から特定 @contact = @user.contact     #⬆︎ 予約可能件数 ActiveRecord::Base.transaction do b1 = 0 booking_params.each do |id,item| booking = Booking.find(id) # 条件1 リクエストにチェックがされていること if item[:request] == "1" # 条件2 時刻が空でないこと if item[:start].blank? && item[:end].blank? flash[:alert] = "空白の時間が見つかりました。" redirect_to @user and return elsif # 条件3 時刻が正しいこと item[:start] >= item[:end] flash[:alert] = "設定時間に誤りがあります" redirect_to @user and return # 条件4 予約件数が可能件数を上回らないこと elsif @booking.count>= @contact flash[:alert] = "可能件数以上の予約はできません" render :edit and return end r1 += 1 booking.update!(item) end end if b1 > 0 flash[:notice] = "受付を#{b1}件申請しました" redirect_to @user else flash[:alert] = "「申請」にチェックを入れて下さい。" redirect_to @user and return end end rescue ActiveRecord::RecordInvalid flash[:alert] = "無効な入力データがあった為、更新をキャンセルしました。" redirect_to redirect_to @user end private def booking_params params.require(:user).permit(bookings:[:request, :start, :end, :remarks])[:bookings] end end
<% @bookings.each do |day| %> <%= f.fields_for "bookings[]", day do |rb| %> <% css_class = case $days_of_the_week[day.date.wday] when '土' 'text-primary' when '日' 'text-danger' end %> <td><%= r.check_box :request, {checked: false, class: "sample"} %></td> <td><%= l(date, format: :short) %></td> <td class="<%= css_class %>"><%= $days_of_the_week[day.date_of_use.wday] %></td> <td><%= r.time_field :start,{ class: "form-control input-sm"}%></td> <td><%= r.time_field :end_time,{ class: "form-control input-sm" } %></td> <td><%= r.text_field :remarks, class: "form-control" %></td> <% end %> <% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

2つ方法があります。

  1. 最初に予約数を調べ、越えていたら止める
  2. 全体を transaction で囲み、予約数が越えていたら例外を出す。

いずれにしても「(その際入力した値は保持)」だとすると
booking.update!(item) といきなりDBにしまうのではなく
booking.attributes = item
で全部のbookingを済ませて @bookings にしまってから、上の処理をしましょう

投稿2021/03/19 08:34

winterboum

総合スコア23567

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

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

zoff77

2021/03/19 09:03

ご回答頂きありがとうございます。 私の知識不足で大変申し訳ないのですが、 booking.attributes = item で全部のbookingを済ませて @bookings にしまってから・・・ との内容が理解できませんでした。 bookingのカラムをitemにいれることで、申請した予約件数が処理できるのですか?
winterboum

2021/03/19 09:07

booking.attributes = item して booking.save! すると booking.update!(item) と同じ効果です。 DBに反映しないで @bookings にデータを入れるためにsaveとわけてます
zoff77

2021/03/19 09:15

理解しました! ご丁寧にありがとうございます。 booking.save!後は@bookings = itemで件数が取れるので、それをcountなどで判定するとの認識ですか?
winterboum

2021/03/19 09:22

@bookings = item は??? ですね。 ただ何らかの方法で数は取れると思いますので。
zoff77

2021/03/19 09:27

承知致しました!! 一度検討させて頂きます たくさん教えて頂き、ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問