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

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

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

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

Q&A

解決済

1回答

2167閲覧

rails validatesについて

smith

総合スコア73

Ruby on Rails

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

0グッド

0クリップ

投稿2015/01/07 01:50

f.date_selectの validatesで今日より10日以上2年未満とするにはどうしたら良いでしょうか

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

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

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

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

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

guest

回答1

0

ベストアンサー

ActiveModel::Validator を継承したクラスでバリデーションメソッドを実装し、それをモデル側でvalidates_with を使用して呼び出す、という方法があるようです

適当なディレクトリにプロジェクトを作成して

lang

1rails --version # => Rails 4.2.0 2rails g model User birthday:date 3rake db:migrate

から始めてみました

spec/models/user_spec.rb : テストは書き慣れていないためツッコミどころはあるとおもいます
(日付の範囲を制限するのに誕生日を想定・設定するというのもおかしいですね...)

lang

1require 'rails_helper' 2 3RSpec.describe User, :type => :model do 4 describe "date validate" do 5 before do 6 @user = User.new 7 Timecop.freeze(Date.current.change(year: 2014, month: 12, day: 31)) 8 end 9 10 subject { @user } 11 12 it "valid: after 10 days from the current date" do 13 @user.birthday = Date.current.advance(days: 10) 14 expect(@user).to be_valid 15 end 16 17 it "valid: within 2 years after the current date" do 18 @user.birthday = Date.current.advance(years: 2) 19 expect(@user).to be_valid 20 end 21 22 it 'invalid: after 9 days from current date' do 23 @user.birthday = Date.current.advance(days: 9) 24 expect(@user).to_not be_valid 25 end 26 27 it 'invalid: 2 years later from the current date' do 28 @user.birthday = Date.current.advance(years: 2, days: 1) 29 expect(@user).to_not be_valid 30 end 31 32 after { Timecop.return } 33 end 34end

app/models/user.rb

lang

1class DateRangeValidator < ActiveModel::Validator 2 def validate(record) 3 error_message = 'Date is not in a valid date range' 4 record.errors[:base] << error_message if valid_dates.exclude? record.birthday 5 end 6 7 def valid_dates 8 after = Date.current.advance(days: 10) 9 before = Date.current.advance(years: 2) 10 (after..before) 11 end 12end 13 14class User < ActiveRecord::Base 15 validates_with DateRangeValidator 16end

Links

validates_timelines gem を利用するほうが簡単なのかもしれません

投稿2015/01/07 04:39

gouf

総合スコア2321

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

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

smith

2015/01/07 04:51

ありがとう御座います。 両方やってみます。
smith

2015/01/07 09:29

無事実装できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問