Подтвердить что ты не робот

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)
4b9b3361

Ответ 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, но anot, определяющий формат , в котором отображается страница new. Следовательно, ошибка ActionController::UnknownFormat.

Ответ 2

Вы также можете изменить файл 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 по умолчанию.

Ответ 3

Хорошо, я люблю этот пост, потому что у меня такая же ошибка. Поэтому я добавил верхнюю строку, как в вашем контроллере reply_to: html,: json

тогда я получил другую ошибку (см. ниже)

Контрольный уровень respond_to' feature has been extracted to the. Добавьте его в свой Gemfile, чтобы продолжить использование этой функции: gem "responseers", "~ > 2.0". Подробнее см. Руководство по обновлению Rails. Но это не имело к этому никакого отношения.

Ответ 4

Эта проблема произошла со мной и сослалась просто добавить

 respond_to :html, :json

в файл ApplicationController

Вы можете проверить проблемы разработки на Github: https://github.com/plataformatec/devise/issues/2667

Ответ 5

Существует еще один сценарий, в котором эта проблема воспроизводится (как в моем случае). Когда ЗАПРОС КЛИЕНТА не содержит правильного расширения на URL-адресе, контроллер не может определить желаемый формат результата.

Например: для контроллера установлено значение respond_to :json (в качестве единственной опции без ответа HTML) - в то время как для клиентского вызова установлено значение /reservations вместо /reservations.json.

В нижней строке измените клиентский вызов на /reservations.json.