2014-09-26 101 views
0

我写了下面的测试,试图更新已保存的已发布文章。意思是用户发布了一篇文章,现在想标记为已保存。我不允许的。为什么它说我正在渲染或调用渲染两次?

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是私人方法的一个促成因素吗?

回答

1

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

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