【问题标题】:ActionController::UnknownFormatActionController::UnknownFormat
【发布时间】:2014-05-21 13:17:37
【问题描述】:

在我的 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)

【问题讨论】:

  • 遇到此错误时能否分享完整的服务器日志?

标签: ruby ajax ruby-on-rails-4 respond-to


【解决方案1】:

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

【讨论】:

  • 没错,显然他没有保存在数据库中(如果 @reservation.save 返回 false)但我不再收到错误
  • 是的..只有当@reservation.save 失败时才会出现错误,因为在这种情况下else 部分在格式丢失的地方执行。
  • 你不需要指定 format.html 或 format.json 除非你在 respond_to 块中调用 render!
【解决方案2】:

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

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

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

【讨论】:

  • 这是我的布局中缺少的脚本标签。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

     respond_to :html, :json
    

    到 ApplicationController 文件

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

    【讨论】:

    • 这不是ApplicationController理解的方法。
    • @Adamantish 你的意思是“respond_to”吗?您可以查看附加的 github 问题链接。
    • 确实如此。也许有一些理由与 rails 5 有关,因为它在那种情况下对我来说不是一种公认​​的方法。
    【解决方案5】:

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

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

    最后,将客户端调用更改为/reservations.json。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多