在我的rails应用程序中,我向服务器发出ajax请求,以存储一些数据。这曾经没有任何问题,但现在我收到一个错误:
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/reservations_controller.rb:45:in `create'
以下是控制器和我的javascript文件,其中我声明数据类型是JSON
class ReservationController < ApplicationController
respond_to :html, :json
def create
...
respond_to do |format|
if @reservation.save
format.html do
redirect_to '/'
end
format.json { render json: @reservation.to_json }
else
render 'new'
end
end # respond_to
end # create
end # ReservationController
function.js
$.ajax({
url: url_link,
dataType: 'json',
type: 'POST',
data: dataToSend
})
完整的错误日志是:
Completed 406 Not Acceptable in 45ms
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/bookings_controller.rb:45:in `create'
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.5ms)
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms)
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (9.6ms)
答案 0 :(得分:46)
更新create
操作,如下所示:
def create
...
respond_to do |format|
if @reservation.save
format.html do
redirect_to '/'
end
format.json { render json: @reservation.to_json }
else
format.html { render 'new'} ## Specify the format in which you are rendering "new" page
format.json { render json: @reservation.errors } ## You might want to specify a json format as well
end
end
end
您正在使用respond_to
方法,但指定了呈现new
页面的格式。因此,错误ActionController::UnknownFormat
。
答案 1 :(得分:24)
您还可以修改config / routes.rb文件,如:
get 'ajax/:action', to: 'ajax#:action', :defaults => { :format => 'json' }
将默认格式设置为json。 在Rails 4中它对我来说很好。
或者,如果您想进一步使用命名空间,可以减少重复项:
namespace :api, defaults: {format: 'json'} do
#your controller routes here ...
end
默认情况下,/api
下的所有内容都将格式化为json。
答案 2 :(得分:3)
这个问题发生在我身上,只需添加
即可 respond_to :html, :json
到ApplicationController文件
您可以在Github上检查设计问题:https://github.com/plataformatec/devise/issues/2667
答案 3 :(得分:1)
我喜欢这篇文章,因为我遇到了类似的错误。 所以我在控制器中添加了顶行 respond_to:html,:json
然后我得到了一个不同的错误(见下文)
控制器级respond_to' feature has been extracted to the
响应者`宝石。将其添加到您的Gemfile以继续使用此功能:gem'responseders','〜&gt; 2.0'有关详细信息,请参阅Rails升级指南。
但这与它无关。
答案 4 :(得分:1)
还有另一种情况是此问题再现(如我的情况)。当客户端请求在URL上不包含正确的扩展名时,控制器无法识别所需的结果格式。
例如:控制器设置为respond_to :json
(作为单个选项,没有HTML响应) - 而客户端调用设置为/reservations
而不是/reservations.json
。
底线,将客户来电更改为/reservations.json
。
答案 5 :(得分:0)
我在尝试呈现 XML 响应时遇到此错误 - 我必须将模板名称从 index.html.erb 更改为 index.xml.erb,然后它才起作用。