gpt4 book ai didi

ruby-on-rails - 路由将 JSON 请求解释为 HTML?

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:34 24 4
gpt4 key购买 nike

使用 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 block ,我可以通过这些日志验证服务器是否以 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 block 的唯一方法是在路由中使用 :format => :json ,然后它工作正常但“localhost:3000/session/nourl”会也用 JSON 响应。

感觉我在这里做了一些愚蠢的事情,因为我已经看到这两种情况都以预期的方式被触发的其他例子,而且我绝对没有看到类似行为的其他案例,所以我不得不认为这是一个孤立的情况或者这是我无法观察到或在其他地方引起的一些级联问题。

如果有人能就潜在问题提供一些见解,我将不胜感激。

更新:

更多信息:如果我查询类似“localhost:3000/locations/1.json”的内容,我会得到预期的响应;带有对象详细信息的 JSON 格式页面。当请求带有“.json”扩展名的任意 URL 并尝试格式化自定义 JSON 响应以返回时,我无法实现相同的行为。有办法做到这一点吗?

最佳答案

Rails 将调用委托(delegate)给所有请求格式内容都丢失的错误应用程序。所以你需要自己检查一下。您可以这样查看请求信息:

  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/

关于ruby-on-rails - 路由将 JSON 请求解释为 HTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com