[英]avoiding the error: missing a template for this request format and variant
我的 ruby on rails 應用程序的端點位於http://localhost:3000/searches/new
。 當我在那里瀏覽瀏覽器時,一切都很好。 但是當我導航到http://localhost:3000/searches/new.json
時,它會引發此錯誤,導致 http-500: SearchesController#new is missing a template for this request format and variant. request.formats: ["application/json"] request.variant: []
SearchesController#new is missing a template for this request format and variant. request.formats: ["application/json"] request.variant: []
我怎樣才能讓它停止這樣做? 我希望它像其他不退出的資源請求一樣返回 404。
更理論上,似乎 ruby on rails 將 URI 路徑末尾的擴展視為某種格式說明符。 這只是 Ruby on Rails 約定嗎? 或者是否有一些我不知道的 URI 或 REST 規范的晦澀條款?
我在 Rails 5.2 上使用 ruby
真奇怪。 當我 append '.json' 到路徑末尾時,某些端點返回 406。 其他,500。這是后者的堆棧跟蹤。
I, [2020-06-16T06:10:06.410101 #2816] INFO -- : Processing by WelcomeController#talent as JSON
D, [2020-06-16T06:10:06.426042 #2816] DEBUG -- : User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 81], ["LIMIT", 1]]
D, [2020-06-16T06:10:06.434018 #2816] DEBUG -- : Private::Conversation Load (0.9ms) SELECT "private_conversations".* FROM "private_conversations" WHERE ("private_conversations"."recipient_id" = $1 OR "private_conversations"."sender_id" = $2) [["recipient_id", 81], ["sender_id", 81]]
D, [2020-06-16T06:10:06.435528 #2816] DEBUG -- : Group::Conversation Load (0.7ms) SELECT "group_conversations".* FROM "group_conversations" INNER JOIN "group_conversations_users" ON "group_conversations"."id" = "group_conversations_users"."conversation_id" WHERE "group_conversations_users"."user_id" = $1 [["user_id", 81]]
D, [2020-06-16T06:10:06.437254 #2816] DEBUG -- : (0.6ms) SELECT "group_conversations"."id" FROM "group_conversations" INNER JOIN "group_conversations_users" ON "group_conversations"."id" = "group_conversations_users"."conversation_id" WHERE "group_conversations_users"."user_id" = $1 [["user_id", 81]]
D, [2020-06-16T06:10:06.439379 #2816] DEBUG -- : CACHE (0.1ms) SELECT "group_conversations"."id" FROM "group_conversations" INNER JOIN "group_conversations_users" ON "group_conversations"."id" = "group_conversations_users"."conversation_id" WHERE "group_conversations_users"."user_id" = $1 [["user_id", 81]]
E, [2020-06-16T06:10:06.448074 #2816] ERROR -- : Traceback (most recent call last):
96: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/puma-4.3.3/lib/puma/thread_pool.rb:134:in `block in spawn_thread'
95: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/puma-4.3.3/lib/puma/server.rb:328:in `block in run'
94: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/puma-4.3.3/lib/puma/server.rb:472:in `process_client'
93: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/puma-4.3.3/lib/puma/server.rb:682:in `handle_request'
92: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/puma-4.3.3/lib/puma/configuration.rb:228:in `call'
91: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/railties-5.2.4.2/lib/rails/engine.rb:524:in `call'
90: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-cors-1.1.1/lib/rack/cors.rb:100:in `call'
89: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-mini-profiler-2.0.1/lib/mini_profiler/profiler.rb:312:in `call'
88: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/sendfile.rb:110:in `call'
87: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/static.rb:127:in `call'
86: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/executor.rb:14:in `call'
85: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
84: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/runtime.rb:22:in `call'
83: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/method_override.rb:24:in `call'
82: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/request_id.rb:27:in `call'
81: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/request_store-1.5.0/lib/request_store/middleware.rb:19:in `call'
80: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
79: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/railties-5.2.4.2/lib/rails/rack/logger.rb:26:in `call'
78: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/tagged_logging.rb:71:in `tagged'
77: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/tagged_logging.rb:28:in `tagged'
76: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/tagged_logging.rb:71:in `block in tagged'
75: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/railties-5.2.4.2/lib/rails/rack/logger.rb:26:in `block in call'
74: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/railties-5.2.4.2/lib/rails/rack/logger.rb:38:in `call_app'
73: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
72: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
71: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/better_errors-2.7.0/lib/better_errors/middleware.rb:57:in `call'
70: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/better_errors-2.7.0/lib/better_errors/middleware.rb:79:in `better_errors_call'
69: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/better_errors-2.7.0/lib/better_errors/middleware.rb:84:in `protected_app_call'
68: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/executor.rb:14:in `call'
67: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
66: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/callbacks.rb:98:in `run_callbacks'
65: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
64: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activerecord-5.2.4.2/lib/active_record/migration.rb:559:in `call'
63: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/middleware/cookies.rb:670:in `call'
62: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/session/abstract/id.rb:260:in `call'
61: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/session/abstract/id.rb:266:in `context'
60: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/http/content_security_policy.rb:18:in `call'
59: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/head.rb:12:in `call'
58: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/conditional_get.rb:27:in `call'
57: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/etag.rb:27:in `call'
56: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/tempfile_reaper.rb:15:in `call'
55: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/warden-1.2.8/lib/warden/manager.rb:34:in `call'
54: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/warden-1.2.8/lib/warden/manager.rb:34:in `catch'
53: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/warden-1.2.8/lib/warden/manager.rb:36:in `block in call'
52: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/remotipart-1.4.4/lib/remotipart/middleware.rb:32:in `call'
51: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/omniauth-1.9.1/lib/omniauth/strategy.rb:169:in `call'
50: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/omniauth-1.9.1/lib/omniauth/strategy.rb:192:in `call!'
49: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/rack-pjax-1.1.0/lib/rack/pjax.rb:12:in `call'
48: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/routing/route_set.rb:840:in `call'
47: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/journey/router.rb:35:in `serve'
46: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/journey/router.rb:35:in `each'
45: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/journey/router.rb:52:in `block in serve'
44: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/routing/route_set.rb:34:in `serve'
43: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
42: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal.rb:252:in `dispatch'
41: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal.rb:191:in `dispatch'
40: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/rendering.rb:32:in `process'
39: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/abstract_controller/base.rb:134:in `process'
38: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activerecord-5.2.4.2/lib/active_record/railties/controller_runtime.rb:24:in `process_action'
37: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
36: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
35: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/notifications.rb:168:in `instrument'
34: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
33: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/notifications.rb:168:in `block in instrument'
32: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
31: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/rescue.rb:22:in `process_action'
30: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/abstract_controller/callbacks.rb:41:in `process_action'
29: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/callbacks.rb:132:in `run_callbacks'
28: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
27: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/rendering.rb:30:in `process_action'
26: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/abstract_controller/base.rb:194:in `process_action'
25: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
24: from /ch/app/controllers/welcome_controller.rb:13:in `talent'
23: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/remotipart-1.4.4/lib/remotipart/render_overrides.rb:23:in `render'
22: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/instrumentation.rb:45:in `render'
21: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/sunspot_rails-2.5.0/lib/sunspot/rails/railties/controller_runtime.rb:15:in `cleanup_view_runtime'
20: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activerecord-5.2.4.2/lib/active_record/railties/controller_runtime.rb:31:in `cleanup_view_runtime'
19: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/instrumentation.rb:87:in `cleanup_view_runtime'
18: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/instrumentation.rb:46:in `block in render'
17: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/core_ext/benchmark.rb:14:in `ms'
16: from /Users/makedon/.rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/benchmark.rb:308:in `realtime'
15: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.4.2/lib/active_support/core_ext/benchmark.rb:14:in `block in ms'
14: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/instrumentation.rb:46:in `block (2 levels) in render'
13: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/rendering.rb:36:in `render'
12: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/abstract_controller/rendering.rb:25:in `render'
11: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/renderers.rb:142:in `render_to_body'
10: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/rendering.rb:52:in `render_to_body'
9: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/rendering.rb:84:in `render_to_body'
8: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionpack-5.2.4.2/lib/action_controller/metal/streaming.rb:219:in `_render_template'
7: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/rendering.rb:103:in `_render_template'
6: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/renderer/renderer.rb:25:in `render'
5: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/renderer/renderer.rb:44:in `render_template'
4: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/renderer/template_renderer.rb:10:in `render'
3: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/renderer/template_renderer.rb:40:in `determine_template'
2: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/renderer/abstract_renderer.rb:20:in `find_template'
1: from /Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/lookup_context.rb:116:in `find'
/Users/makedon/.rvm/gems/ruby-2.6.5/gems/actionview-5.2.4.2/lib/action_view/path_set.rb:48:in `find': Missing template welcome/talent, application/talent with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :haml]}. Searched in: (ActionView::MissingTemplate)
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/bh-1.3.6/lib/bh/views"
* "/ch/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/twitter-bootstrap-rails-4.0.0/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/rails_admin_mydash-0.1.8/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/bundler/gems/rails_admin-782d4ddac486/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/mailboxer-0.15.1/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/kaminari-core-1.2.0/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/devise_invitable-1.7.5/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/devise-4.7.1/app/views"
I, [2020-06-16T06:10:06.449514 #2816] INFO -- : Completed 500 Internal Server Error in 39ms (ActiveRecord: 3.3ms)
F, [2020-06-16T06:10:06.461776 #2816] FATAL -- :
ActionView::MissingTemplate - Missing template welcome/talent, application/talent with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :haml]}. Searched in:
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/bh-1.3.6/lib/bh/views"
* "/ch/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/twitter-bootstrap-rails-4.0.0/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/rails_admin_mydash-0.1.8/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/bundler/gems/rails_admin-782d4ddac486/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/mailboxer-0.15.1/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/kaminari-core-1.2.0/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/devise_invitable-1.7.5/app/views"
* "/Users/makedon/.rvm/gems/ruby-2.6.5/gems/devise-4.7.1/app/views"
:
app/controllers/welcome_controller.rb:13:in `talent'
I, [2020-06-16T06:10:06.652543 #2816] INFO -- : Started POST "/__better_errors/377e20f2e19f9287/variables" for 127.0.0.1 at 2020-06-16 06:10:06 -0700
您應該能夠在您的應用程序 controller 中編寫自己的default_render
方法來覆蓋缺失格式的處理方式。
You can see how the behaviour was changed in the ActionController (which your application controller inherits) code base to change the default behaviour here https://github.com/rails/rails/commit/0de4a23d1cfa6ef44a27ac8aca5055487282460e Here they are changing the behaviour to render a狀態 204,但這應該為如何使用 404 響應提供靈感。
這是最新版本的動作 controller 以及它如何處理丟失的格式https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/implicit_render.rb#L33一定要閱讀文檔也在 class 的頂部。
但是,我不得不問——為什么?
我認為當前版本的 rails 會返回 406 狀態碼——這是 HTTP 規格,用於缺少格式。 規范還描述了應該使用接受 header 來請求格式 - 我認為 URL 結尾是一個軌道假設。
這看起來像是welcome_controller 的人才方法中的實際500 錯誤,而不是在缺少模板時更改核心rails 行為的願望。 我懷疑某些 gem 導致了 500 錯誤(我首先會責怪設備;這就是我的 json 響應出現問題的原因),但需要查看 controller(可能還有更多)才能進一步評論。
與此同時,以實用主義的名義,而不是挖掘第三方寶石……
默認情況下,rails 將在請求時嘗試以 json 格式響應任何操作,並且它使用 json 模板文件的存在作為如何響應的指南。 這樣,您只需創建一個 json 模板並且“它就可以工作”。 但是,您可以明確告訴一個方法只響應 html:
def talent
...
respond_to :html
end
或者,如果您在任何 Welcome 操作中都沒有任何非 html 響應,則可以在 controller 級別執行此操作:
class WelcomeController < ApplicationController
respond_to :html
def talent
# Your code
end
end
如果您想明確地只對所有操作使用 html 響應,您甚至可以在 application_controller 級別執行此操作; 但請注意這一點。
另請參閱https://api.rubyonrails.org/classes/ActionController/MimeResponds.html以在您的操作中更多地使用respond_to
。
因此,總結一下自我發布問題以來的發現,似乎一些控制器響應了使用 406 指定不受支持格式的請求,這是正確且可接受的行為。 而另一個回應,500 這很糟糕,因為 500 引發了警報。 聽起來要弄清楚為什么它的行為不同可能需要很長時間。
我采用了有點老套的解決方案,但它是結束瑣碎錯誤警報的最快方法。 我剛剛為所有缺失的模板創建了包含“不支持”文本的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.