[解決済み] railsで日付の検証を行うには?
2023-02-04 13:18:33
質問
Ruby on Railsのモデルで日付を検証したいのですが、日、月、年の値がモデルに到達するまでにすでに不正確な日付に変換されています。
例えば、ビューで2009年2月31日と入力した場合、モデルで
Model.new(params[:model])
を使用すると、それは "March 3rd 2009" に変換され、モデルはそれを有効な日付と見なしますが、それは不正確です。
この検証をモデルで行えるようにしたいと思います。できる方法はありますか、それとも完全に間違っているのでしょうか。
私はこの"を見つけました。 日付の検証 を見つけ、その問題を議論しましたが、解決されませんでした。
どのように解決するのですか?
を使っているのでしょう。
date_select
ヘルパーを使用していると思います。他の方法としては、日、月、年のフィールドにselect formヘルパーを使用することです。こんな感じです(使用した例はcreated_atの日付フィールドです)。
<%= f.select :month, (1..12).to_a, selected: @user.created_at.month %>
<%= f.select :day, (1..31).to_a, selected: @user.created_at.day %>
<%= f.select :year, ((Time.now.year - 20)..Time.now.year).to_a, selected: @user.created_at.year %>
そして、モデルの中で、日付を検証します。
attr_accessor :month, :day, :year
validate :validate_created_at
private
def convert_created_at
begin
self.created_at = Date.civil(self.year.to_i, self.month.to_i, self.day.to_i)
rescue ArgumentError
false
end
end
def validate_created_at
errors.add("Created at date", "is invalid.") unless convert_created_at
end
プラグインによる解決策を探しているなら、私は validates_timeliness プラグインをチェックアウトします。これは次のように動作します(githubページより)。
class Person < ActiveRecord::Base
validates_date :date_of_birth, on_or_before: lambda { Date.current }
# or
validates :date_of_birth, timeliness: { on_or_before: lambda { Date.current }, type: :date }
end
利用可能な検証方法の一覧は以下の通りです。
validates_date - validate value as date
validates_time - validate value as time only i.e. '12:20pm'
validates_datetime - validate value as a full date and time
validates - use the :timeliness key and set the type in the hash.
関連
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
[解決済み] nil:NilClass の未定義メソッド `each' - しかし、なぜ?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み] JavaScriptで現在の日付を取得するには?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み】JavaScriptで10進数を検証する - IsNumeric()
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み】TypeError: SymbolからIntegerへの暗黙の変換がない。
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み] どのようにrailsでラジオボタンを正しく使用するには?
-
[解決済み] AWS S3です。アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレスされている必要があります。
-
[解決済み] railsでhidden fieldタグを使用する方法
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] RSpecとCucumberの違いは何ですか?[クローズド]
-
[解決済み] 文字列が有効な日付であるかどうかを確認する方法