2

Ruby 1.8.7 と Rails 3.2.12 を使用。

「.json」拡張子を持つ URL をテストするときに問題が発生しています。私はカスタムエラーページを構築しており、次のものがあります:

# errors_controller.rb
def show
  @exception = env["action_dispatch.exception"]
  respond_to do |format|
    format.json { render :json => { :error => @exception.message, :status => request.path[1..-1] } } 
    format.html { render :file => File.join(Rails.root, 'public', request.path[1..-1]), :format => [:html], :status => request.path[1..-1], :layout => false } 
  end
end

# routes.rb
match ":status" => "errors#show", :constraints => { :status => /\d{3}/ }

# application.rb
config.exceptions_app = self.routes

「localhost:3000/session/nourl.json」などの URL の場合、の HTML ブロックをトリガーrespond_toし、サーバーがこれらのログで HTML 形式で応答することを確認できます。

Processing by ErrorsController#show as HTML
Parameters: {"status"=>"404"}
Rendered public/404.html (13.2ms)
Completed 404 Not Found in 48ms (Views: 47.3ms | ActiveRecord: 0.0ms)

JSONブロックをトリガーできる唯一の方法:format => :jsonはルート内であり、それは正常に機能しますが、「localhost:3000/session/nourl」もJSONで応答します。

両方のケースが期待どおりにトリガーされた他の例を見たことがあり、同様の動作の他のケースはまったく見られないため、ここで何か愚かなことをしているように感じます。したがって、これは孤立した状況であるか、私が観察できない、または他の場所で引き起こしているカスケード問題。

潜在的な問題について誰かが洞察を提供できれば、私は感謝します。

更新しました:

もう少し情報: 「localhost:3000/locations/1.json」のようなクエリを実行すると、期待どおりの応答が得られます。オブジェクトの詳細を含む JSON 形式のページ。「.json」拡張子を持つ任意の URL を要求し、返されるカスタム JSON 応答をフォーマットしようとすると、これと同じ動作を実現できません。これを行う方法はありますか?

4

1 に答える 1

3

Rails は、すべての要求形式のものが失われる Error-Application への呼び出しを委譲します。そのため、自分で確認する必要があります。次のようにリクエスト情報を確認できます。

  def api_request?
    env['ORIGINAL_FULLPATH'] =~ /^\/api/
  end

  def json_request?
    env['ORIGINAL_FULLPATH'] =~ /\.json$/
  end

このアプローチの詳細については、http: //phillipridlen.com/notes/2012/12/13/returning-multiple-formats-with-custom-dynamic-error-pages-in-rails/をご覧ください。

于 2013-11-07T15:00:02.763 に答える