【Rails】빈 문자로도 용서해 주는 밸리데이션을 만든다

7288 단어 Rails정규식
「올바른 URL인가, 혹은 공란이라면 OK」라고 한다
정규 표현식을 설정할 때 유효성 검사 설정입니다.

추가



h tps : // / ls lgus s. jp/아c치ゔぇ_레코 rd_ゔぃぃ다치온 s. html#아아ㅋㅋㅋㄱk
Active Record의 밸리데이션 기능에는, allow_blank 라고 하는 편리한 옵션이 있는 것을 코멘트로 가르쳐 주셨습니다. 감사합니다.
이 기사의 존재의의는 얇아졌지만 계명으로 남겨두려고 합니다.

먼저 결론



「정규 표현에 매치한 값 OR 공문자("")」를 통과하는 것 같은
유효성 검사를 설정하려는 경우 쓰기

app/models/hogehoge.rb
class 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 입력은 임의'로 만들고 싶었기 때문에
  • 어떤 값이 입력되면 올바른 URL인지 확인
  • 아무것도 입력하지 않으면 체크하지 마십시오

  • 이런 구조로 하고 싶습니다.

    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

    좋은 웹페이지 즐겨찾기