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 ヘッダーまたはファイル拡張子から他の方法で判断できない場合、これはデフォルトのフォーマットを設定するだけです。
ルート レベルでこれを行う方法はないのではないかと考え始めています。