【问题标题】:Why is it stating I am rendering or calling render twice?为什么它说我正在渲染或调用渲染两次?
【发布时间】:2014-09-26 20:31:04
【问题描述】:

我编写了以下测试,尝试将已发布的帖子更新为已保存。这意味着用户已经发布了一篇文章,现在想要将其标记为已保存。这是我不允许的。

it "should not update a post from published to saved" do
  @post = FactoryGirl.create(:post, blog_id: @blog.id, saved: false, published: true)
  put :update, :id => @post.id, post: {title: 'Sample Title', content: @post.content, saved: true}
  expect(response.status).to eql 422
end

这个特定的测试状态:

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

这不应该是这样,因为如果我们看一下抛出它的方法:

def post_controller_save(post, params)
  do_not_save_published_post(post, params)
  binding.pry
  publish_post(post, params)
  if post.save
    set_tags(post, params)
    set_categories(post, params)
    render json: post, status: 200
  else
    render json: {:errors => post.errors}, status: 422
  end
end

我们做的第一个检查是do_not_save_published_posts(post, params)(注意它后面的binding.pry)。

所以如果我们按照这个,我们会看到有问题的方法(这是一个私有方法):

def do_not_save_published_post(post, params)
  if (post.published && params[:post][:saved])
    binding.pry
    render json: {:errors => 'Cannot save a published post.'}, status: 422
    return
  end
end

此方法检查相关帖子是否已发布。并且 post 对象的参数包含已保存的参数。如果这两个都为真,我们将呈现错误并返回。这里的关键是注意这个binding.pry

在测试中,它到达这个断点,然后键入exit 会导致跳过返回并捕获此方法之外的binding.pry

这不应该发生。它应该为我呈现状态为 422 的 json。事实上,do_not_save_published_post 是一个私有方法是一个促成因素吗?

【问题讨论】:

    标签: render ruby-on-rails-4.1


    【解决方案1】:

    您对do_not_save_published_post 的调用只是一个普通的方法调用,从该方法返回的行为与普通 Ruby 一样,因为它将在方法调用之后继续执行代码。

    您可能希望将您的 do_not_save_published_post 更改为 published_post?,将其移动到您的模型中,让它返回一个布尔值,然后在控制器中执行您的渲染逻辑。

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 1970-01-01
      • 2020-09-07
      • 2022-10-02
      • 2021-12-06
      • 2014-02-16
      • 2020-03-17
      • 2020-07-11
      相关资源
      最近更新 更多