1

次の 4 つの形式に一致するルートを許可する必要があります。

  • ふー
  • foo.json
  • foo.bar
  • foo.bar.json

ルートが「.json」で終わる場合、その前の部分だけが一致する必要があるため、これら 4 つの例で一致する可能性があるのは「foo」と「foo.bar」だけです。

次の正規表現を思いつきました:が、Rails ではルート制約で/.*?(?=\.json|\Z)/使用できないため、機能しません。\Z

正規表現アンカー文字は、ルーティング要件では許可されていません:/.*?(?=\.json|\Z)/

これまたは別の正規表現を回避する方法はありますか?

4

5 に答える 5

1

私が最終的に行ったことは、2 つの異なるルートを作成することでした。1 つは最後に JSON を使用し、もう 1 つは使用せず、両方とも異なる正規表現を使用します。以前はこのようなルートでした。

get ':foo', to: 'foo#bar', constraints: { foo: /.*?(?=\.json|\Z)/ }

次のようになります。

get ':foo.json', to: 'foo#bar', constraints: { foo: /.*?(?=\.json)/ }, format: :json
get ':foo',      to: 'foo#bar', constraints: { foo: /.*?/ }
于 2013-05-26T19:46:31.317 に答える
1

.matches? を定義する独自のオブジェクトを作成できるはずです。方法。@mrhoboの正規表現と組み合わせるとうまくいくはずです。

http://guides.rubyonrails.org/routing.html#advanced-constraints

于 2013-05-26T18:54:10.810 に答える
1

次の正規表現は、文字列全体に一致し、必要な部分のみをキャプチャします

(.*?)(?:\.json)?$

http://regex101.com/r/sM6rD0

この正規表現は、必要な部分のみを照合してキャプチャします

^((?:.(?!\.json$))*(?:$|.))

http://rubular.com/r/SdtEDiWPRX

ただし、2 番目の正規表現は非常に複雑であり、一致とキャプチャがまったく同じである必要があるとは思えません。しかし、繰り返しになりますが、私はレールについてあまり知りません:)

于 2013-05-26T17:10:01.270 に答える
0

URL を制限する必要はありませんが、次のようにフォーマットするだけです。

  get 'foo', format: /bar|json|bar\.json/, to: 'main#foo'

フォーマットはコントローラーで次のように利用できますparams[:format]

于 2013-05-26T17:05:00.497 に答える