为什么它说我正在渲染或调用渲染两次?
问题描述:
我写了下面的测试,试图更新已保存的已发布文章。意思是用户发布了一篇文章,现在想标记为已保存。我不允许的。为什么它说我正在渲染或调用渲染两次?
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: Render and/or redirect were called multiple times in this action.
,因为如果我们看一下方法多数民众赞成把它扔不应该是这样的:
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
这个方法检查,如果有问题的帖子的发布。并且后对象的参数包含保存的参数。如果这两个都是真的,我们会渲染一个错误并返回。这里的关键是注意这binding.pry
。
在测试中,它到达了这个中断点,然后输入exit
会导致返回被跳过并且binding.pry
出现在这个方法的外面。
这不应该发生。它应该使我的状态为422的json。事实是,do_not_save_published_post
是私人方法的一个促成因素吗?
答
您对do_not_save_published_post
的调用只是一个普通的方法调用,并且从此方法返回的行为与普通的Ruby类似,因为它将在方法调用后继续执行代码。
您可能想要将do_not_save_published_post
更改为published_post?
,将其移至您的模型,让它返回一个布尔值,然后在控制器中执行渲染逻辑。