Route将JSON请求解释为HTML?

时间:2013-11-06 18:46:58

标签: ruby-on-rails ruby json mime-types

使用Ruby 1.8.7和Rails 3.2.12。

我在测试扩展名为“.json”的网址时遇到问题。我正在构建自定义错误页面并具有以下内容:

# 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,我触发respond_to的HTML块,我可以验证服务器是否使用这些日志的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响应以返回时,我无法实现此相同的行为。有没有办法做到这一点?

1 个答案:

答案 0 :(得分: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/