我遇到了双重渲染错误,我无法在模型的更新方法中删除。
这是控制器的代码
class Admin::CmsHappeningNowFeatureController < ApplicationController
def index
# Various model data retrieval...
render 'admin/cms/hn_features/index', layout: 'admin_cms'
end
# Works fine
def edit
@feature = CmsHappeningNowFeature.find_by_id(params[:id])
render 'admin/cms/hn_features/feature', layout: 'admin_cms'
end
# Throws a AbstractController::DoubleRenderError upon submission
def update
@feature = CmsHappeningNowFeature.find_by_id(params[:id])
@feature.attributes = params[:cms_happening_now_feature]
if @feature.save
redirect_to(:action => index, :notice => "Successfully updated feature.") and return
end
render 'admin/cms/hn_features/feature', layout: 'admin_cms'
end
# ... rest of the class
end
重定向到另一个控制器时,问题消失。似乎重定向到同一个控制器使rails执行该方法而不实际发送重定向。通过查看日志,在提交更新表单时,会调用update
,然后调用index
,执行索引render
,然后然后重定向发布并失败。
我错过了什么?什么是解决方法?
答案 0 :(得分:4)
好的,真正的原因在于
redirect_to(:action => index, :notice => "Successfully updated feature.") and return
# ^^^^^ This calls the index method
你调用index
方法然后首先渲染。然后,redirect_to
调用将返回该函数的结果(这将是render
中index
调用返回的任何内容)。并第二次渲染
你真正想写的是:
redirect_to(:action => :index, :notice => "Successfully updated feature.") and return
将:action
设置为符号,即表示操作但不直接调用它的索引。
答案 1 :(得分:1)
你有
if @feature.save
redirect_to(:action => index, :notice => "Successfully updated feature.") and return
end
哪个重定向到索引然后从索引重定向再次获取引发的错误
试试这个并告诉我它是否有效:
if @feature.save
index
flash[:notice] = "Successfully updated feature."
return
end
答案 2 :(得分:0)
我也遇到过这个问题,但它没有涉及控制器中的任何重定向或多个渲染。我们有一个直接触发电子邮件的动作,没有后端队列来启动它。这使用ActionMailer gem,我相信它会在.haml或其他模板上进行渲染,以生成电子邮件的html。然后我们发送电子邮件后使用了 最后渲染更新电话
这会导致此错误吗? Rails认为ActionMailer的电子邮件模板呈现是一个常规渲染?它只是一个猜测,不知道它可能是什么.....我也不能100%重现它但是看起来不像日志中的并发性事情我只看到一个对控制器的调用。 / p>
欢迎任何想法,谢谢。