2012-11-11 6 views
7

Tôi có một hành động trong bộ điều khiển mà tôi đang gặp sự cố. Đây là ứng dụng đường ray đầu tiên của tôi, vì vậy tôi không chắc chắn về các phương pháp hay nhất xung quanh đường ray.Điều khiển thoát khỏi đường ray sau khi hiển thị

Tôi có một mô hình được gọi là Nhóm và một vài hành động đi vào bộ điều khiển của nó. Tôi đã viết một thử nghiệm sẽ khiến cho bộ điều khiển hiển thị lỗi trong JSON do ID nhóm không hợp lệ. Thay vì hiển thị và thoát, có vẻ như trình điều khiển đang hiển thị và tiếp tục thực thi.

thử nghiệm

test 'should not remove group because of invalid group id' do 
    post(:remove, {'group_id' => '3333'}) 
    response = JSON.parse(@response.body) 
    assert_response :success 
    assert_equal 'Success', response['message'] 
end 

điều khiển hành động

# Post remove 
# group_id 
def remove 
    if((@group = Group.find_by_id(params[:group_id])) == nil) 
     render :json => { :message => "group_id not found" } 
    end 

    @group.destroy 
    if(!Group.exists?(@group)) 
     render :json => { :message => "Success" } 
    else 
     render :json => { :errors => @group.errors.full_messages } 
    end 
end 

Trong bộ điều khiển, người đầu tiên nếu tuyên bố thực thi: render :json => { :message => "group_id not found" } nhưng @group.destroy vẫn đang được thực hiện. Điều này có vẻ phản trực giác với tôi, tôi nghĩ rằng phương thức render sẽ thoát khỏi controller.

Tại sao bộ điều khiển không thoát sau render được gọi?

Mục đích của khối mã này là để khôi phục một cách duyên dáng khi không có bản ghi nào có thể được tìm thấy với ID được chuyển vào. Đây có phải là cách làm đúng như thế này không?

Trả lời

15

Giống như @ user1022209 nói, bạn có thể thêm lợi nhuận để thoát khỏi hành động:

render(:json => { :message => "group_id not found" }) and return 

Về mã của bạn, tôi nghĩ rằng tôi sẽ viết như thế này:

def remove 
    if(!Group.exists?(params[:group_id]) 
    render :json => { :message => "group_id not found" } 
    else 
    @group = Group.find(params[:group_id] 
    @group.destroy 
    if @group.destroyed? 
     render :json => { :message => "Success" } 
    else 
     render :json => { :errors => @group.errors.full_messages } 
    end 
    end 
end 
+0

Tuyệt vời. Thêm một trở lại làm việc tuyệt vời. – codysehl

7

Chỉ cần chỉ cần thêm return; sau render để thoát khỏi cơ thể phương pháp :)

Tôi nghĩ render chỉ là một lời gọi phương thức, bạn gọi nó, và phương pháp này sẽ được đặt trên đỉnh của ngăn xếp mà giữ chuỗi các thực hiện phương pháp. Sau khi bạn hoàn thành render, bạn quay lại phương thức remove và tiếp tục thực hiện phần còn lại. Nhưng bạn có thể tránh vấn đề này bằng cách thủ công thoát khỏi phương pháp remove

It is my drawing to illustrate the concept described by the words above