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

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

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

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

Q&A

1回答

190閲覧

ほぼ同じ内容の二つのカスタムバリデーションファイルを一つのファイルにまとめたい

kokosi1062

総合スコア39

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/01/27 12:38

編集2022/01/27 12:38

ほぼ同じ内容のカスタムバリデーションファイルが2つあります。
1つのファイルにしたいのですが、可能でしょうか?
違いは record.errors.add(attribute, :invalid) unless format =~ value
のメッセージ部分だけです。

使用目的はpasswordカラムを使うときは、passwordバリデーターを
IDカラム使うときは、IDバリデーターを適用する感じです。

ruby

1class IdValidator < ActiveModel::EachValidator 2 def validate_each(record, attribute, value) 3 num = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]|(?=.*?[A-Z])(?=.*?\d)[A-Z\d]|(?=.*[!@;:])(?=.*?\d)[!@;:\d]+\z/ 4 id = / 5 #{num}| 6 /x 7 format = id 8 record.errors.add(attribute, :invalid) unless format =~ value 9 end 10end

ruby

1class PasswordValidator < ActiveModel::EachValidator 2 def validate_each(record, attribute, value) 3 num = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]|(?=.*?[A-Z])(?=.*?\d)[A-Z\d]|(?=.*[!@;:])(?=.*?\d)[!@;:\d]+\z/ 4 password = / 5 #{num}| 6 /x 7 format = password 8 record.errors.add(attribute, :password) unless format =~ value 9 end 10end

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

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

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

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

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

guest

回答1

0

errors.add のところの :invaalid と :password の違いだけですね・
それとこのテストでは :id か:passowrdしかテストしないのですね?

まず、どちらで使っても違和感のない名前に変更してください。

message = case attribute when :id ; :invalid when :password ; :password else ; raise end

として、errors.add(attribute, messge) とすれば良いでしょう。
それで動くと思いますが、
codeとしてはnum = から format =までがなんとも。
いきなり format = / ここに / でよいはず。
いまのcodeのまま書くにしても、num という変数名は 数値 を連想させますから悪い命名です。正規表現を連想させる命名にしましょう。

投稿2022/01/27 23:01

winterboum

総合スコア23333

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問