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)
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
。
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としてフォーマットされます。
この問題は私で発生し、追加するだけで解決しました
respond_to :html, :json
applicationControllerファイルへ
GithubでDeviseの問題を確認できます: https://github.com/plataformatec/devise/issues/2667
この問題が再現する別のシナリオがあります(私の場合)。クライアントリクエストのURLに適切な拡張子が含まれていない場合、コントローラーは目的の結果形式を識別できません。
たとえば、コントローラーはrespond_to :json
(HTML応答なしの単一オプションとして)に設定されますが、クライアント呼び出しは/reservations
ではなく/reservations.json
に設定されます。
一番下の行では、クライアント呼び出しを/reservations.json
に変更します。
よく似たエラーが出たので、この投稿が好きです。コントローラーのrespond_to:html、:jsonのように一番上の行を追加しました
その後、別のエラーが発生しました(以下を参照)
コントローラーレベルのrespond_to' feature has been extracted to the
responders` gem。この機能を引き続き使用するには、Gemfileに追加してください:gem 'responders'、 '〜> 2.0'詳細については、Railsアップグレードガイドを参照してください。しかし、それはそれとは何の関係もありませんでした。