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 Not Acceptable. Никаких переопределений.

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

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

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


person okay56k    schedule 14.06.2013    source источник
comment
у вас есть remote: true в вашей форме? он отправляется через JS? у вас есть respond_to :json в вашем контроллере?   -  person phoet    schedule 14.06.2013
comment
В форме нет remote: true, и она не отправляется через JS. В моем контроллере нет respond_to :json, потому что, насколько я знаю, он мне не нужен.   -  person okay56k    schedule 14.06.2013


Ответы (2)


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

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

person iltempo    schedule 14.06.2013

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

person gertas    schedule 15.02.2014