为什么在after_action中调用redirect_to时会出现“AbstractController :: DoubleRenderError”?

问题描述 投票:0回答:2

在评论控制器中,我在创建和销毁之后重定向到文章显示页面。所以我决定写一个after_action,它会做redirect_to

class CommentsController < ApplicationController
  before_action :find_article
  before_action :find_comment, only: [:destroy]

  after_action :goto_articles_page, only: [:create, :destroy]

  def create
    @comment = @article.comments.create(comment_params)
  end

  def destroy
    @comment.destroy
  end

  private

    def comment_params
      params.require(:comment).permit(:commenter, :body)
    end

    def find_article
      @article = Article.find(params[:article_id])
    end

    def find_comment
       @comment = @article.comments.find(params[:id])
    end

    def goto_articles_page
      redirect_to article_path(@article) and return
    end
end

但是在创造和毁灭之后,这给了我AbstractController::DoubleRenderError

为什么我收到此错误?

ruby-on-rails
2个回答
1
投票

默认情况下,Rails将呈现与控制器操作对应的视图。 See Rails Guides.

所以在你的createdestroy动作中,Rails默认执行渲染。然后你的after_action(在动作之后发生)重定向,所以它是双重渲染。

您可以在控制器操作中调用after_action方法而不是goto_articles_page

例如:

  def destroy
    @comment.destroy
    goto_articles_page
  end

  def goto_articles_page
    redirect_to article_path(@article) #return not needed
  end

0
投票

我认为使用returnrendering任何行动,但当redirect_to使用然后不需要使用return然后最后你可以删除and return

Rails guide非常好地解释说你可以仔细遵循这一点

redirect_to解释

希望能有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.