【Rails】빈 문자로도 용서해 주는 밸리데이션을 만든다
정규 표현식을 설정할 때 유효성 검사 설정입니다.
추가
h tps : // / ls lgus s. jp/아c치ゔぇ_레코 rd_ゔぃぃ다치온 s. html#아아ㅋㅋㅋㄱk
Active Record의 밸리데이션 기능에는, allow_blank
라고 하는 편리한 옵션이 있는 것을 코멘트로 가르쳐 주셨습니다. 감사합니다.
이 기사의 존재의의는 얇아졌지만 계명으로 남겨두려고 합니다.
먼저 결론
「정규 표현에 매치한 값 OR 공문자("")」를 통과하는 것 같은
유효성 검사를 설정하려는 경우 쓰기
app/models/hogehoge.rbclass Hogehoge < ApplicationRecord
VALID_REGEX = /正規表現|\A\z/
validates :fugafuga,
format: { with: VALID_REGEX }
end
schema.rb
에서 해당 열의 기본값default: ""
와 같이 설정해 두는 것.
하고 싶은 일
URL을 Strings 형식으로 저장하는 기능을 구현하고 있으며,
'입력된 URL이 올바른지 여부'를 확인하기 위해
정규식을 사용한 검증을 설정하려고 했습니다.
URL과 일치하는 정규식으로 유효성 검사
htps //w w. 안경 ft. 이. jp/미후 s/세이키/s310. HTML
여기를 참조하여 모델에 유효성 검사를 설정합니다.
app/models/try.rb# 余計な行は省略
class Try < ApplicationRecord
VALID_URL_REGEX = /https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+|\A\z/
validates :source_url,
length: { maximum: 255 },
format: { with: VALID_URL_REGEX, message: '正しいURLを入力してください' }
end
rails console
로 거동을 확인해 봅니다.
# 余計な行は省略
$ bin/rails c
Running via Spring preloader in process 93581
Loading development environment (Rails 5.2.3)
[1] pry(main)> try = Try.new=> #<Try:0x00007f9f14fa31c8
id: nil,
source_url: "",
created_at: nil,
updated_at: nil,
>
[2] pry(main)> try.save!
(0.3ms) BEGIN
(0.4ms) ROLLBACK
ActiveRecord::RecordInvalid: バリデーションに失敗しました:
ソースURL 正しいURLを入力してください,
빈 문자("")가 정규식과 일치하지 않아 유효성 검증에 실패했습니다.
그런 다음 URL로 잘못된 항목을 입력해 봅니다.
[3] pry(main)> try.source_url = 'hogehoge'
=> "hogehoge"
[4] pry(main)> try.save!
(0.3ms) BEGIN
(0.4ms) ROLLBACK
ActiveRecord::RecordInvalid: バリデーションに失敗しました:
ソースURL 正しいURLを入力してください,
의도한 대로 URL로 이상한 문자열은 유효성 검사에 실패합니다.
올바른 URL을 입력해 봅니다.
[5] pry(main)> try.source_url = 'https://qiita.com/'
=> "https://qiita.com/"
[10] pry(main)> try.valid?
=> true
유효성 검사를 통과했습니다.
제대로 설정된 것 같습니다.
빈 문자로도 통과 할 수 있기를 원합니다.
하지만 이렇게 하면 올바른 URL을 입력해야 합니다. 방해입니다.
이번에는 'URL 입력은 임의'로 만들고 싶었기 때문에
class Hogehoge < ApplicationRecord
VALID_REGEX = /正規表現|\A\z/
validates :fugafuga,
format: { with: VALID_REGEX }
end
# 余計な行は省略
class Try < ApplicationRecord
VALID_URL_REGEX = /https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+|\A\z/
validates :source_url,
length: { maximum: 255 },
format: { with: VALID_URL_REGEX, message: '正しいURLを入力してください' }
end
# 余計な行は省略
$ bin/rails c
Running via Spring preloader in process 93581
Loading development environment (Rails 5.2.3)
[1] pry(main)> try = Try.new=> #<Try:0x00007f9f14fa31c8
id: nil,
source_url: "",
created_at: nil,
updated_at: nil,
>
[2] pry(main)> try.save!
(0.3ms) BEGIN
(0.4ms) ROLLBACK
ActiveRecord::RecordInvalid: バリデーションに失敗しました:
ソースURL 正しいURLを入力してください,
[3] pry(main)> try.source_url = 'hogehoge'
=> "hogehoge"
[4] pry(main)> try.save!
(0.3ms) BEGIN
(0.4ms) ROLLBACK
ActiveRecord::RecordInvalid: バリデーションに失敗しました:
ソースURL 正しいURLを入力してください,
[5] pry(main)> try.source_url = 'https://qiita.com/'
=> "https://qiita.com/"
[10] pry(main)> try.valid?
=> true
이런 구조로 하고 싶습니다.
schema.rb
# 余計な行は省略
create_table "tries", force: :cascade do |t|
t.string "source_url", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
URL 저장
source_url
열에 NOTNULL 제약 조건을 설정합니다.디폴트의 값으로서 공문자 ("")를 넣고 있었습니다.
요점은 이 공문자("")가 정규 표현에 매치해 주면 되므로,
(正しいURLにマッチする正規表現)|(空文字にマッチする正規表現)
의 형태로 수정하려고 생각했습니다.빈 문자("")와 일치하는 정규식
이것을 시도했지만 결국 여기에서 성공했습니다.
app/models/try.rb
VALID_URL_REGEX = /https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+|\A\z/
안 좋은 예
app/models/try.rb
# railsに怒られる
VALID_URL_REGEX = /https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+|^$/
app/models/try.rb
# hogehogeでもマッチしてしまう
VALID_URL_REGEX = /https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+|/
산코우
htps : // 이 m / j 치토 / / ms / 에 7832df6f64 9034872
Reference
이 문제에 관하여(【Rails】빈 문자로도 용서해 주는 밸리데이션을 만든다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/E-46/items/d3af599c5fcd2ed2daf6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)