我正在将一个应用程序升级到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时 action不处理请求格式。默认情况下,例外是 通过响应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 }
给了我一个no方法错误,似乎将我重定向回编辑页面:
Showing .../fin/app/views/docs/_form.html.erb where line #19 raised:
undefined method `covers?' for nil:NilClass
真的不知道这里发生了什么。
答案 0 :(得分:2)
一个可能的原因是,如果@doc.update_attributes(params[:doc])
返回false
,则更新方法中不会执行任何格式块。
通常在这种情况下渲染edit
动作。
答案 1 :(得分:1)
如果您只提供HTML,那么您根本不需要respond_to
和format.html
。