0

routes.rbファイルにワイルドカード ルートがあります。

get "*client" => "client#show"

コントローラーで、データベース内のクライアントを検索し、カスタム ページを表示します。

def show
  @client = Client.find_by(slug: params[:client])

  if @client.nil?
    render file: "client/404", layout: "error", status: :not_found
    return
  end
end

これはうまく機能しますが、私の問題は、見つからないアセットもclient#showハンドラーを介してルーティングされていることです。

これにより、クライアントのデータベースで無意味なルックアップが行われ、500 エラーが発生します。これは、Rails が非 HTML 形式のエラー ページをレンダリングする方法を認識していないためです。

私の質問は、HTML 以外のフォーマットがワイルドカード ハンドラーに入らないようにするにはどうすればよいですか?

私は無駄に次のことを試しました:

フォーマットの制約

ルートの周りにスコープを配置して、HTML 形式に制限します。

scope :format => true, :constraints => { :format => 'html' } do
  get "*client" => "client#show"
end

これにより、アセットがハンドラーにルーティングされなくなりますが、残念ながら、ページが明示的に.html拡張子で終わっている場合にのみ、ページがハンドラーにルーティングされます。失敗。

フォーマット デフォルト

次に、 format defaultを試してみようと思いました。そのようです:

get "*client" => "client#show", :defaults => { :format => 'html' }

残念ながら、まだ従業員はいません。変更はありません。私の理解では、Rails が content-type ヘッダーまたはファイル拡張子から他の方法で判断できない場合、これはデフォルトのフォーマットを設定するだけです。

ルート レベルでこれを行う方法はないのではないかと考え始めています。

4

2 に答える 2

0

アセットがハンドラーに入るのをレベルで制限する方法がわからなかったので、ハンドラーrouteの先頭にチェックを入れて、リクエストが HTML 形式でない場合にハンドラーを短絡させました。

def show
  render nothing: true, status: :not_found and return if invalid_format?
  ...
end

private

def invalid_format?
  request.format != "html"
end
于 2015-01-31T19:51:13.117 に答える