web-dev-qa-db-ja.com

ActionController :: UnknownFormat

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)
42
tvieira

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ページがレンダリングされるformatを指定していません。したがって、エラーActionController::UnknownFormat

46
Kirti Thorat

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としてフォーマットされます。

24
BPH

この問題は私で発生し、追加するだけで解決しました

 respond_to :html, :json

applicationControllerファイルへ

GithubでDeviseの問題を確認できます: https://github.com/plataformatec/devise/issues/2667

3
Abdallah Okasha

この問題が再現する別のシナリオがあります(私の場合)。クライアントリクエストのURLに適切な拡張子が含まれていない場合、コントローラーは目的の結果形式を識別できません。

たとえば、コントローラーはrespond_to :json(HTML応答なしの単一オプションとして)に設定されますが、クライアント呼び出しは/reservationsではなく/reservations.jsonに設定されます。

一番下の行では、クライアント呼び出しを/reservations.jsonに変更します。

2
orberkov

よく似たエラーが出たので、この投稿が好きです。コントローラーのrespond_to:html、:jsonのように一番上の行を追加しました

その後、別のエラーが発生しました(以下を参照)

コントローラーレベルのrespond_to' feature has been extracted to theresponders` gem。この機能を引き続き使用するには、Gemfileに追加してください:gem 'responders'、 '〜> 2.0'詳細については、Railsアップグレードガイドを参照してください。しかし、それはそれとは何の関係もありませんでした。

1