2013-07-13 49 views
1

Rails如何計算控制器操作的響應代碼?Rails如何計算操作的響應代碼

考慮下列控制器動作:

def update 
    respond_to do |format| 
    if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: 'show' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

(我使用的是相同的視圖來顯示和編輯記錄)

有了這個積極的測試:

test "should update basic user information" do 
    user = users(:jon) 
    user.first_name="Jonas" 
    put :update, :id => user.id, :merchant_user =>user.attributes 
    assert_response :found 
    user = Merchant::User.find(user.id) 
    assert user.first_name == "Jonas", "Should update basic user information" 
end 

而且一負面測試是這樣的:

test "should not update user email for an existing email" do 
    user = users(:jon) 
    original_user_email = user.email 
    existing_user_email = users(:doe) 
    user.email=existing_user_email.email 
    put :update, :id => user.id, :merchant_user =>user.attributes 
    assert_response :success 
    user = Merchant::User.find(user.id) 
    assert user.email == original_user_email, "Should not update email for an exising one" 
end 

成功更新記錄會導致一個302響應代碼,我假設rails資源/:ID的缺省值爲302。無法更新記錄導致200 OK。

這些響應代碼是如何計算的?我如何覆蓋它們?

感謝

+1

有是HTML和JSON請求返回的不同代碼。我認爲200 OK會返回保存錯誤,以確保與瀏覽器行爲的兼容性。 –

回答

5

見下

if @user.update(user_params) 
    format.html { redirect_to @user, notice: 'User was successfully updated.' } 
    # 302, the save was successful but now redirecting to the show page for updated user 
    # The redirection happens as a 「302 Found」 header unless otherwise specified. 

    format.json { head :no_content } 
    # 204, successful update, but don't send any data back via json 

else 
    format.html { render action: 'show' } 
    # 200, standard HTTP success, note this is a browser call that renders 
    # the form again where you would show validation errors to the user 

    format.json { render json: @user.errors, status: :unprocessable_entity } 
    # 422, http 'Unprocessable Entity', validation errors exist, sends back the validation errors in json 

end 

直列意見,如果你看一下format.json { render json: @user.errors, status: :unprocessable_entity }它使用上renderstatus選項是明確有關HTTP狀態代碼 所以你可以做render action: 'show', status: 422render action: 'show', status: :unprocessable_entity,如果你想(你可能不會) - 並且默認爲200 Ok(導軌使用符號:success來別名:ok以及

還看到:

看到Getting access to :not_found, :internal_server_error etc. in Rails 3 在控制檯Rack::Utils::HTTP_STATUS_CODES查看所有狀態代碼(該值在軌符號),即Unprocessable Entity:unprocessable_entity

1
  1. 我很懷疑你的代碼的工作,你的控制器使用update代替update_attributesupdate是ActiveRecord :: Callback中的一個私有方法,它不能公開使用。感謝Michael的評論指出update是Rails 4中的update_attributes的替代品,雖然沒有提到有問題。

  2. 測試響應是不必要的,它更不必要打破傳統的響應代碼。相反,請檢查對ActiveRecord以及響應正文或路徑所採取的效果。

+0

在rails 4中可能會使用更新,而不是update_attributes –

+0

@MichaelSzyndel,謝謝你提到。我還不知道,只是檢查並驗證它是真的。 –