Rails 3, возвращающий HTTP 406, не приемлем?

#ruby-on-rails #routing

#ruby-on-rails #маршруты

Вопрос:

У меня есть следующий код контроллера:

   def create
    @admin = Admin.new(params[:admin])
    respond_to do |format|
      if @admin.save
        redirect_to(@admin, :notice => 'Admin was successfully created.')
      else
        render :action => "new"
      end
    end
  end

  def update
    @admin = Admin.find(params[:id])
    respond_to do |format|
      if @admin.update_attributes(params[:admin])
        redirect_to(admin_admins_path, :notice => 'Admin was successfully updated.')
      else
        render :action => "edit"
      end
    end
  end
  

и следующие маршруты:

            admin_admins GET    /admin/admins(.:format)            {:action=>"index", :controller=>"admin/admins"}
           admin_admins POST   /admin/admins(.:format)            {:action=>"create", :controller=>"admin/admins"}
        new_admin_admin GET    /admin/admins/new(.:format)        {:action=>"new", :controller=>"admin/admins"}
       edit_admin_admin GET    /admin/admins/:id/edit(.:format)   {:action=>"edit", :controller=>"admin/admins"}
            admin_admin GET    /admin/admins/:id(.:format)        {:action=>"show", :controller=>"admin/admins"}
            admin_admin PUT    /admin/admins/:id(.:format)        {:action=>"update", :controller=>"admin/admins"}
            admin_admin DELETE /admin/admins/:id(.:format)        {:action=>"destroy", :controller=>"admin/admins"}
  

Теперь, помимо слегка странного именования — перенаправления всегда приводят к неприемлемому 406. Что может быть не так?

Ответ №1:

Удалите respond_to do |format| блоки. Потому что вы не указываете, в каком формате вы отвечаете, например, format.html { #your code here } . Проверьте документацию response_to, как правильно его использовать.

Ответ №2:

У меня была похожая ошибка, мой контроллер отвечал только на JSON. Мне нужно было, чтобы он отвечал на HTML также для работы тестов (что имеет смысл только):

 class AdsController < ApplicationController
  respond_to :json, :html
  

Я получил ошибку при попытке выполнить: assert_redirected_to ad_url(ad)

Комментарии:

1. Это устранит проблему, только если вы используете в сочетании с respond_with @obj . В противном случае указание respond_to в контроллере является noop.

2. @maletor, неверно. ошибки 406 генерируются независимо от того, respond_with используется или нет.

Ответ №3:

У меня возникла эта проблема после развертывания в рабочей среде, даже несмотря на то, что в процессе разработки все работало нормально.

Примерно через 15 минут потерянного времени я, наконец, обнаружил, что я забыл зафиксировать некоторые файлы просмотра (например, index.html.erb).

Использование tail -f log/production.log на сервере выявило: FATAL -- : ActionController::UnknownFormat (SomeController#index is missing a template for this request format and variant.

При разработке ошибки не произошло, потому что, очевидно, присутствовал файл просмотра.