Rails 4: что не так с этим методом?

Я обновляю приложение до Rails 4, и я не могу на всю жизнь выяснить, что не так с этим методом. Нарушитель использует метод обновления:

def update
  respond_to do |format|
    if @doc.articles.find_index { |a| a.changed? }
      @doc.publications.destroy_all
    end
    if @doc.update_attributes(params[:doc])
      @doc.create_activity :update, owner: current_user
      if current_user.brand.editable? && params[:editing]
        format.html { redirect_to editing_url(@doc) }
      else 
        format.html { redirect_to share_url(@doc.user.ftp, @doc) }
      end
    end
  end
end

Нажатие submit генерирует эту ошибку:

ActionController::UnknownFormat in DocsController#update

и выделяет эту строку:

respond_to do |format|

Метод create отлично работает, он выглядит так:

def create
  @doc = Doc.new(params[:doc])
  respond_to do |format|
    if @doc.save
      @doc.create_activity :create, owner: current_user
      if current_user.brand.editable? && params[:editing]
        format.html { redirect_to doc_editing_url(@doc) }
      else 
        format.html { redirect_to share_url(@doc.user.ftp, @doc) }
      end
    else
      format.html { render action: "new" }
    end
  end
end

Любые мысли вообще? Я полностью застрял.

О, у меня есть этот частный метод как before_action, так что это не так:

private

def set_document
  @doc = Doc.find(params[:id])
end

ИЗМЕНИТЬ

Я нашел это квази-объяснение:

В Rails 4.0 ActionController:: UnknownFormat возникает, когда действие не обрабатывает формат запроса. По умолчанию исключение обрабатывается путем ответа 406 Not Acceptable, но вы можете переопределить это сейчас. В Rails 3 всегда возвращался 406 недопустимый. нет переопределение.

что заставляет меня думать, что это связано с маршрутами, но мои маршруты должны быть по умолчанию, если я объявил их так, да?

resources :docs, :except => [:new, :show] do
  get "adjust/:state" => "docs#adjust", :as => :adjust
  patch "editing" => "docs#editing", :as => :editing
  patch "reupdate/" => "docs#reupdate", :as => :reupdate
  get "pdf" => "docs#pdf", :as => :pdf
  collection { post :sort }
end

РЕДАКТИРОВАТЬ 2

Добавление JSON к контроллеру, то есть:

format.html { redirect_to share_url(@doc.user.ftp, @doc) }
format.json { render action: 'share', status: :created, location: @doc }

дает мне ошибку метода и, кажется, перенаправляет меня обратно на страницу редактирования:

Showing .../fin/app/views/docs/_form.html.erb where line #19 raised:
undefined method `covers?' for nil:NilClass

Не знаю, что здесь происходит.

Ответ 1

Одна из возможных причин может заключаться в том, что если @doc.update_attributes(params[:doc]) возвращает false, в методе обновления не выполняется блок формата.

Обычно вы выполняете действие edit в этом случае.

Ответ 2

Если вы используете только HTML, вам не нужны respond_to и format.html вообще.