【发布时间】:2013-11-18 04:06:31
【问题描述】:
使用 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,我触发了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 响应以返回时,我无法实现相同的行为。有没有办法做到这一点?
【问题讨论】:
-
您是否将标头与您的 JSON 请求一起发送以告诉控制器传入的请求是
Content-Type: application/json? -
需要更多信息。请发布您的错误控制器的所有路线。
-
@CoolTapes- 具体是什么信息?给出的路由是我目前唯一需要的,因为它根据 request.path 状态代码动态显示页面。
-
@CDub- 当我在 url 中指定请求格式时,内容类型未设置为 application/json 是否有原因?
-
去这里phillipridlen.com/notes/2012/12/13/…阅读“响应多种格式”
标签: ruby-on-rails ruby json mime-types