私は Rails を使用しており、URL のパラメーターになるユーザー入力フィールドがあります。現在、ユーザーがそのような値を入力すると、「[GET]に一致するルートがありません...」というエラーが発生するため、ルーティングエラーの原因となるフィールドにユーザーが入力するのを防ぐ検証を追加したいと思います。ピリオドとスラッシュは許可されていません...
検証にはどの正規表現を使用すればよいですか? または、Rails が動的セグメントにデフォルトで使用する正規表現は何ですか?
私は Rails を使用しており、URL のパラメーターになるユーザー入力フィールドがあります。現在、ユーザーがそのような値を入力すると、「[GET]に一致するルートがありません...」というエラーが発生するため、ルーティングエラーの原因となるフィールドにユーザーが入力するのを防ぐ検証を追加したいと思います。ピリオドとスラッシュは許可されていません...
検証にはどの正規表現を使用すればよいですか? または、Rails が動的セグメントにデフォルトで使用する正規表現は何ですか?
誰も実際に質問に答えていないので、回避策を提案しました。(適切な状況でそれらを使用する場合は、おそらくどちらの方が良いでしょう。) 私は、問題を引き起こした文字を見つけるために実験しました。標準の US キーボードで使用可能なすべての句読点をテストしました。スペースと(水平)タブもテストしました。拡張 Unicode 句読点も制御文字もテストしませんでした。
webrick と composite_primary_keys gem を使用して、Rails 3.2.9 で問題を引き起こすことがわかった文字は次のとおりです。
,/.%
フィールドにこれらの文字が含まれていないことを検証するには:
validates :field_name, :format => { :with => /\A[^,\/\.%]*\z/,
:message => "commas, slashes, periods, and percent signs (,/.%) are not allowed"}
私が試した他の文字の多くは、URL で直接有効ではありませんが、Rails は自動的に URL エンコードするため、問題は発生しません。
元の質問のコメントで述べたように、これらの文字の一部はデフォルト以外の Rails を構成することで有効にできますが、そうすると Rails の他の機能が無効になります。それらを有効にするには、ルート定義に追加:constraints
または設定する必要があります。:id
これらすべての文字を有効にすることを完全にテストしたわけではありませんが、結果は次のようになると思います。
Ch 使用可能化の結果 -- --------------------------------------- 、gem composite_primary_keys を使用してはなりません / 子アイテムへのルーティング機能を制限する . 自動フォーマット処理を無効にします % これを有効にできるかどうかわからない
action_pack の Rails コードより action_dispath/journey/path/pattern.rb
@separator_re = "([^#{separator}]+)" # where separator comes from @separators = "/.?"
したがって、動的セグメントに一致させるために使用されるデフォルトの正規表現は次のようになります。
/([^\/\.\?])/
おそらく、 to_params + parameterize を使用してURLを書き込むよりも、ユーザーに何でも挿入させることができます。正規表現が必要な場合は、パラメーター化のソースコードを見てください。
to_params の例、ドキュメントとソース コードは次を参照してください: http://apidock.com/rails/ActiveSupport/Inflector/parameterize
それが役に立てば幸い!