activeresource错误状态和响应正文

时间:2009-03-26 17:01:42

标签: ruby-on-rails activeresource

我正在对服务进行activeresource调用,我想要一些自定义错误消息作为反馈。我有一些不是正常模型验证的验证,所以我不能只返回@ object.errors。

因此,例如,我的一个验证就是这个。两个对象具有多对多关系,但我想将一个对象限制为仅与其他对象具有有限数量(比如2)的关系。这是一些代码:

在客户端:

response = Customer.find(customer_id).put(:add_user, :user_id => user_id)

这会将请求添加到客户。然后在服务中我想检查这个添加是否有效。

def add_user    
 @user = User.find(params[:user_id])
 @customer = Customer.find(params[:id])
 if @customer.users.length > 2
  render :xml => "ERR_only_2_users_allowed", :status => :unprocessable_entity
 end
end

这是我的问题。在活动资源中,如果返回状态是错误,则客户端完全失败。我可以将状态更改为200并且我恢复身体错误信息,但这似乎打败了错误响应代码的目的。

我可以将来自客户端的整个请求调用放在开始/救援块

begin
    response = Customer.find(customer_id).put(:add_user, :user_id => user_id)
  rescue ActiveResource::ResourceInvalid => e
    #return error code
end

但是当我捕获422(unprocessable_entity)响应时,我什么都没有得到正文,所以我没有得到我的自定义错误消息。 response = nil

有没有人知道如何使用正确的响应代码来实现这些自定义错误消息?

2 个答案:

答案 0 :(得分:4)

这可能是也可能不是你的问题,但我们两个似乎都非常接近。我正在使用自定义put方法,但他也应该为你工作。发生了什么是执行此操作的代码:

rescue ResourceInvalid => error
     errors.from_xml(error.response.body)
end

仅使用标准保存方法。如果你想在调用其他方法时添加错误,看起来你需要自己动手。

我不得不把它添加到 供应商/轨道/的ActiveResource / LIB / active_resource / custom_methods.rb

这是我从git看到的差异: 旧代码:

def put(method_name, options = {}, body = '')
  connection.put(custom_method_element_url(method_name, options), body, self.class.headers)
end

新代码:

def put(method_name, options = {}, body = '')
  begin
    connection.put(custom_method_element_url(method_name, options), body, self.class.headers)
  rescue ResourceInvalid => error
    errors.from_xml(error.response.body)
  end
  self 
end

因此,当获取422抛出的异常并查看它正在调用的方法时,请查看堆栈跟踪。然后添加类似于我的东西,你应该很高兴。

不要问我为什么activeresource人认为验证应该只使用他们的保存方法。保存方法执行创建或更新,但调用'put或post'完全相同,IMO。如果我们希望验证可以用于保存,我们希望它们能够在put和post上工作......无论如何都要试一试。

我不确定我最后是否需要自我......我可能不会。我并没有完全做到这一点,因为我只是弄清楚如何使它工作。 埃里克

答案 1 :(得分:0)

我认为您的问题可能是响应不是xml文档而只是一个普通的字符串。尝试将render语句更改为:

render :xml => { :error => "ERR_only_2_users_allowed" }, :status => :unprocessable_entity