2

我正在对服务进行 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,然后我可以很好地取回 body err msg,但这似乎违背了错误响应代码的目的。

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

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

但是当我捕捉到 422 (unprocessable_entity) 响应时,我什么也没得到,所以我没有收到我的自定义错误消息。响应 = 无

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

4

2 回答 2

5

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

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

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

我不得不将它添加到 vendor/rails/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 的人认为验证只适用于他们的 save 方法。保存方法执行创建或更新,但调用“放置或发布”是完全相同的事情,IMO。如果我们希望验证在保存时起作用,我们希望它们在放置和发布时起作用……无论如何,试一试。

我不确定我最后是否需要自我……我可能不需要。我还没有完全完成这个,因为我只是想出了如何让它工作。埃里克

于 2009-07-19T00:41:05.060 回答
0

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

render :xml => { :error => "ERR_only_2_users_allowed" }, :status => :unprocessable_entity
于 2009-05-29T18:59:32.280 回答