我正在对服务进行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
有没有人知道如何使用正确的响应代码来实现这些自定义错误消息?
答案 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