0

管理者がルートパスにページを作成できるようにしようとしています。これまでのところ私は持っています:

get ':path' => "pages#show" ,:as =>:page, :path => /[^\.]+/

基本的に、ドットが含まれているすべてのパス(.pngなど)を無視しようとしています。すべてが拒否されるため、これは機能しないようです(フォント、アイコン、画像など、パブリックディレクトリ内のものだけを拒否する必要があります)。

ありがとう

4

2 に答える 2

5

上記のコメントで説明したように、目的のアセットが存在しない場合、「公開されているものはすべてWebサーバーによって直接レンダリングされます」は当てはまりません。これにより、キャッチオールルートがこの望ましくない副作用をキャッチすることになります。私が説明したように、これは多くの問題を引き起こす可能性があります。したがって、これを補うために特定のキャッチオールルートが必要です。

get ':path' => "pages#show", :as => :page, :constraints => lambda{|req| req.path !~ /\.(png|jpg|js|css)$/ }

正規表現は、ブロックを:constraintsオプションに渡すことができることを示すことで、正しい軌道に乗せることが私の目標であったため、適切と思われる方法で操作できます。また、私はreq.formatをテストしただけではありません。これは、js形式のヘッダー情報を持つリクエストが除外され、これらのタイプのリクエストに対してキャッチオールが機能しなくなるためです(キャッチオールの通常のケースではありませんが、それは無関係です) )。代わりにreq.pathを使用することにより、ヘッダー情報はそのまま/機能したままになり、パスによって、この要求がこのルートによってキャッチされるかどうかが決まります。

これがお役に立てば幸いです。

テスト:キャッチオールが実際に必要なものをキャッチしていて、追加のパブリックリソースをキャッチしていないかどうかをテストするには、次の手順に従います。まず、PagesControllerのキャッチオールアクションにデバッガーを配置します。次に、localhost:3000 / images / example_image.pngのように、存在する公開ファイルpng / js / cssファイルにリクエストを送信します。これにより、通常どおり、キャッチオールにヒットすることはありません。ここで、パスを存在しないイメージlocalhost:3000 / images/no_image.pngに変更します。リクエストがデバッガーにヒットしない場合、catch-allはイメージファイルリクエストとALLSETをキャッチしていません。リクエストがデバッガーにヒットした場合、それはキャッチオールが画像ファイルリクエストをキャッチしていることを意味します。つまり、キャッチオールの制約を修正する必要があります。

于 2014-03-06T20:28:05.087 に答える
3

デフォルトでは、動的セグメントはドットを受け入れません。これは、ドットがフォーマットされたルートの区切り文字として使用されるためです。動的セグメント内でドットを使用する必要がある場合は、これをオーバーライドする制約を追加します。たとえば、:id => / [^ /] + /は、スラッシュ以外のものを許可します。

http://guides.rubyonrails.org/routing.html#bound-parameters

したがって、条件を削除するだけで機能します。ただし、この問題には別のより良い解決策があるかもしれません。

于 2012-06-26T15:55:16.423 に答える