AbstractController :: CommentsController中的DoubleRenderError #create

时间:2017-07-09 00:57:47

标签: ruby-on-rails ruby

我有一点问题,这段代码有效:

def create
  @article = Article.find(params[:article_id])
  if verify_recaptcha
    @comment = @article.comments.create(comment_params)
    redirect_to article_path(@article)
  else
    redirect_to article_path(@article)
  end
end

为什么这段代码不起作用?:

def create
  @article = Article.find(params[:article_id])
  if verify_recaptcha
    @comment = @article.comments.create(comment_params)
    redirect_to article_path(@article)
  else
    render(
      html: "<script>alert('Recaptcha error!')</script>".html_safe,
      layout: 'application'
    )
    redirect_to article_path(@article)
  end
end

我收到此错误:

  

AbstractController :: CommentsController中的DoubleRenderError #create   在此操作中多次调用渲染和/或重定向。

请注意,您只能调用渲染或重定向,每次操作最多一次。

另请注意,redirectrender都不会终止操作的执行,因此如果要在重定向后退出操作,则需要执行redirect_to(...) and return之类的操作。

2 个答案:

答案 0 :(得分:1)

不要将renderredirect_to合并。您已将application.html.erb文件呈现为布局,而html是您指定的script

如果你想使用render,你必须知道这个没有在目标行动中运行任何代码,所以,如果你想重新分配&#34;您必须使用@article变量redirect_to,如果您想添加一些消息以通知用户,那么您可以添加flash消息,然后您可以显示该消息在你看来:

...
else
  flash[:error] = 'Recaptcha error!'
  redirect_to @article
end

然后在你看来:

<% if flash[:error] %>
  <div class="error">
    <%= flash[:error] %>
  </div>
<% end %>

答案 1 :(得分:0)

我建议您尝试 render_to_string 而不是 render

来源:https://api.rubyonrails.org/v6.1.0/classes/AbstractController/Rendering.html

问候