質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
Ruby on Rails 6

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

Q&A

解決済

2回答

348閲覧

表示させたいエラーメッセージが表示できません。

Espri

総合スコア3

Ruby on Rails 6

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

0グッド

0クリップ

投稿2023/08/12 08:31

実現したいこと

スケジュールの終了時間(finish_datetime)が開始時間(start_datetime)より早い時間を設定した場合と開始時間が現在時刻より早い時間を設定した場合に任意のエラーメッセージを表示したい。

発生している問題

Railsでスケジュール管理アプリを作成しております。
現状、スケジュールの終了時間(finish_datetime)が開始時間(start_datetime)より早い時間を設定した場合、schedule.rbで記述しているエラーメッセージが表示されずschedules_comtroller.rbに記述したエラーメッセージが表示されてしまいます。開始時間が現在時刻より早い時間を設定した場合はスケジューryが登録できてしまいます。
こちらschedule.rbに記載したエラーメッセージを表示させるにはどちらを修正するべきなのでしょうか?

該当のソースコード

schedulelist/app/models/schedule.rb

1class Schedule < ApplicationRecord 2 belongs_to :user 3 4 validates :content, presence: true, length: { maximum: 255 } 5 validates :start_datetime, presence: true 6 validates :finish_datetime, presence: true 7 validate :start_finish_check 8 validate :start_check 9 10 def start_finish_check 11 errors.add(:finish_datetime, "は開始時刻より遅い時間を選択してください") if self.start_datetime > self.finish_datetime 12 end 13 14 def start_check 15 errors.add(:start_datetime, "は現在の日時より遅い時間を選択してください") if self.start_datetime < Time.now 16 end 17end

schedulelist/app/controllers/schedules_controller.rb

1class SchedulesController < ApplicationController 2 before_action :require_user_logged_in 3 4 def create 5 @schedule = current_user.schedules.build(schedule_params) 6 if @schedule.save 7 flash[:success] = 'スケジュールを登録しました。' 8 redirect_to root_url 9 else 10 @pagy, @schedules = pagy(current_user.schedules.order(id: :desc)) 11 flash.now[:danger] = 'スケジュールの登録に失敗しました。' 12 render 'toppages/index' 13 end 14 end 15 16 def destroy 17 @schedule = Schedule.find(params[:id]) 18 19 @schedule.destroy 20 flash[:success] = 'スケジュールを削除しました。' 21 redirect_to root_url 22 end 23 24 def edit 25 @schedule = Schedule.find(params[:id]) 26 end 27 28 def update 29 @schedule = Schedule.find(params[:id]) 30 31 if @schedule.update(schedule_params) 32 flash[:success] = 'スケジュールは正常に更新されました' 33 redirect_to root_url 34 else 35 flash.now[:danger] = 'スケジュールは更新されませんでした' 36 render :edit 37 end 38 end 39 40 private 41 42 def schedule_params 43 params.require(:schedule).permit(:content, :start_datetime, :finish_datetime) 44 end 45end

補足情報(FW/ツールのバージョンなど)

記載しているファイルが不十分な場合、お申し付けください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

問題は2つあります。

  1. model に定義したエラーメッセージが表示されない
  2. start_finish_check 違反でも登録できてしまう

1 は viewの問題である可能性が高いです。
'toppages/index' や edit に @schedule.errors を表示する仕掛けが有りますか?

2 は「はてな、、、」ですね。code見た感じでは問題なさそう。
validate :start_finish_check がきちんと動いているか、minitestなりrspecなり rails console なり なんかで試してみてその結果を載せてください。

投稿2023/08/13 00:26

winterboum

総合スコア23645

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

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

Espri

2023/08/15 11:07

返信遅れました。申し訳ありません。 1についてなのですがviewで@schedule.errorsを表示するにはどうしたらいいのでしょうか?初心者で分からず、お願い致します。
winterboum

2023/08/15 11:30

[rails エラーメッセージの表示] [検索]
Espri

2023/08/15 13:41

1については_error_messageファイルをrenderしていなかったのが原因でした。 無事解決しました。ありがとうございます。 何度も質問して申し訳ないのですが、もう一点だけお願い致します。 datetimeに関してマイグレーションファイルでnull: falseを、バリデーションでpresence: trueを設定しているのですが空で投稿ボタンをクリックすると『undefined method `>' for nil:NilClass』のエラーメッセージが表示されます。個人的な推測といたしましてはdatetimeが空判定になった後にモデルにあるstart_finish_checkが実行されself.start_datetimeに何も入っていない状態なのでエラーが出ているのではないかと考えております。 この場合、空判定が出たタイミングでエラーメッセージを表示させるにはどうすればいいのでしょうか? 自分の推測が違った場合は修正点を教えていただけると幸いです。 補足ですがstart_datetime, finish_datetimeをともに入力し、モデルにあるバリデーションも満たしている状態でcontentを空で投稿ボタンをクリックするとcontent can't be blankのエラーメッセージを表示できています。 追記で必要なファイルがございましたらお申し付けください。
winterboum

2023/08/15 23:34

そういう質問は エラーメッセージを下手な編集や翻訳せずに載せるのが基本です。 でないと、運が良くて エスパーモードでの回答になります。 if self.start_datetime < Time.now とか self.start_datetime > self.finish_datetime ですね。 このvalidate methodの頭で、データが有ることを確認してください。無ければ true で帰る。
guest

0

rb

1flash.now[:danger] = @schedule.errors

とかでしょうか

投稿2023/08/12 15:12

yuma.inaura

総合スコア1453

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

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

Espri

2023/08/12 15:52 編集

コントローラーのエラーメッセージはそのまま採用したくて "スケジュールの終了時間(finish_datetime)が開始時間(start_datetime)より早い時間を設定した場合と開始時間が現在時刻より早い時間" この場合にschedule.rbのエラーメッセージが表示されるようにしたいのですがその場合はどちらを修正すれば良いのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問