2014-09-26 4 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 

이 특정 테스트 상태 :

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)입니다 : 우리가 방법을 보면 던지는 이잖아 때문에 경우 안

AbstractController::DoubleRenderError: Render and/or redirect were called multiple times in this action.

(그 후에 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 

이 방법 검사 문제의 게시물이 게시 된 경우 : 우리는이를 따르는 경우

그래서, 우리는 (개인 방법입니다) 문제의 방법을 참조하십시오. 게시 개체에 대한 params에는 저장된 매개 변수가 포함되어 있습니다. 두 가지 모두 사실이라면 오류를 렌더링하고 반환합니다. 여기에서 중요한 것은이 binding.pry에 주목하는 것입니다.

테스트에서이 중단 점에 도달 한 다음 exit을 입력하면 반환을 건너 뛰고이 메서드의 바깥 쪽이 캐치됩니다.

이렇게해서는 안됩니다. 그것은 나를 422의 상태로 json으로 렌더링해야합니다. 사실, do_not_save_published_post은 개인적인 방법으로 기여하는 요소입니까?

답변

1

do_not_save_published_post에 대한 호출은 일반적인 메소드 호출 일 뿐이며,이 메소드에서 리턴하는 것은 메소드 호출 후 코드를 계속 실행한다는 점에서 일반 Ruby처럼 작동합니다.

do_not_save_published_postpublished_post?으로 변경하고, 모델로 옮기고, 불리언 값을 반환하고, 컨트롤러에서 렌더링 논리를 수행하고자합니다.

관련 문제