1

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 对于 GET 资源/:ID 默认为 302。更新记录失败会导致 200 OK。

如何计算这些响应代码以及如何覆盖它们?

谢谢

4

2 回答 2

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 }它,则使用statuson 选项render来明确 HTTP 状态代码,以便您可以这样做,render action: 'show', status: 422或者render action: 'show', status: :unprocessable_entity如果您愿意(您可能不这样做) - 并将默认值呈现为(rails也200 Ok使用符号:success来别名:ok

也可以看看:

请参阅 在控制台中的 Rails 3 中访问 :not_found、:internal_server_error 等Rack::Utils::HTTP_STATUS_CODES以查看所有状态代码(这些值是 rails 中的符号),Unprocessable Entity:unprocessable_entity

于 2013-07-13T15:21:04.967 回答
1
  1. 我非常怀疑您的代码是否在您使用update而不是update_attributes在控制器中工作。update是 ActiveRecord::Callback 中的私有方法,不能公开使用。 感谢迈克尔的评论指出update是 Rails 4 中的替代品update_attributes,尽管没有提及。

  2. 测试响应是不必要的,更没有必要打破常规的响应代码。相反,请检查对 ActiveRecord 的影响以及响应正文或路径。

于 2013-07-13T10:27:08.773 回答