50

在我的 Rails 应用程序中,我向服务器发出了 ajax 请求,以存储一些数据。这曾经没有任何问题,但现在我收到一个错误:

ActionController::UnknownFormat (ActionController::UnknownFormat):
  app/controllers/reservations_controller.rb:45:in `create'

如下是控制器和我声明数据类型为 JSON 的 javascript 文件

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

函数.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)
4

6 回答 6

57

更新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

于 2014-04-08T18:00:10.740 回答
30

您还可以修改 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。

于 2015-02-26T19:14:01.160 回答
4

这个问题发生在我身上,只需添加即可解决

 respond_to :html, :json

到 ApplicationController 文件

您可以在 Github 上查看设计问题:https ://github.com/plataformatec/devise/issues/2667

于 2017-06-18T12:47:02.297 回答
4

还有另一种情况会重现此问题(如我的情况)。当客户端请求在 url 上不包含正确的扩展名时,控制器无法识别所需的结果格式。

例如:控制器设置为respond_to :json(作为单个选项,没有 HTML 响应)- 而客户端调用设置为/reservations而不是/reservations.json.

底线,将客户端调用更改为/reservations.json.

于 2018-04-01T05:03:46.683 回答
1

好吧,我喜欢这篇文章,因为我遇到了类似的错误。所以我在你的控制器中添加了第一行 response_to :html, :json

然后我得到了一个不同的错误(见下文)

控制器级respond_to' feature has been extracted to the响应者的 gem。将其添加到您的 Gemfile 以继续使用此功能: gem 'responders', '~> 2.0' 请参阅 Rails 升级指南了解详细信息。但这与它无关。

于 2015-02-04T02:14:33.040 回答
0

尝试呈现 XML 响应时出现此错误 - 我必须将模板名称从 index.html.erb 更改为 index.xml.erb,然后它才起作用。

于 2021-03-21T06:29:34.863 回答