2

我在模型的更新方法中遇到了双重渲染错误,我无法摆脱它。

这是控制器的代码

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执行 from index然后发出重定向并失败。

我错过了什么?解决方法是什么?

4

3 回答 3

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为符号的位置,即表示操作但不直接调用它的索引。

于 2012-05-08T14:13:09.370 回答
1

你有

if @feature.save
   redirect_to(:action => index, :notice => "Successfully updated feature.") and return
end 

哪个重定向到 index 然后再次从 index 重定向,这会引发错误

试试这个,让我知道它是否有效:

if @feature.save
   index
   flash[:notice] = "Successfully updated feature." 
   return
end 
于 2012-05-04T22:03:55.240 回答
0

我也遇到了这个问题,但是它不涉及到控制器中的任何重定向或多个渲染。我们有一个直接触发电子邮件的操作,没有后端队列可以放置它。这使用 ActionMailer gem,我相信它会在 .haml 或其他模板上进行渲染以生成电子邮件的 html。然后我们在发送电子邮件后在最后使用渲染更新调用

这会导致这个错误吗?Rails 认为 ActionMailer 的电子邮件模板渲染是常规渲染?它只是一个猜测,不知道它可能是什么.....我也不能 100% 重现它,但看起来不像是并发的东西,因为在日志中我只看到一个对控制器的调用。

欢迎任何想法,谢谢。

于 2015-01-14T15:32:10.213 回答