статус ошибки 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), я ничего не получаю от тела, поэтому я не получаю свое собственное сообщение об ошибке. ответ = ноль

Кто-нибудь знает, как я могу получить эти пользовательские сообщения об ошибках с правильными кодами ответов?


person brad    schedule 26.03.2009    source источник


Ответы (2)


Это может быть или не быть вашей проблемой, но наши обе кажутся очень близкими. Я использую пользовательский метод put, но он должен работать и у вас. Что происходит, так это то, что код, который делает это:

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

Работает только со стандартным методом сохранения. Если вы хотите, чтобы при вызове других методов добавлялись ошибки, похоже, вам нужно сделать это самостоятельно.

Мне пришлось добавить его в vendor/rails/activeresource/lib/active_resource/custom_methods.rb

Вот как выглядит мой diff из 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 считают, что проверки должны работать только с их методом сохранения. метод сохранения создает или обновляет, но вызов «поместить или опубликовать» — это то же самое, ИМО. Если мы хотим, чтобы проверки работали при сохранении, мы хотим, чтобы они работали при размещении и публикации... в любом случае попробуйте.

Я не уверен, нужно ли мне это «я» в конце… может, и нет. Я еще не совсем закончил с этим, поскольку я только что понял, как заставить его работать. Эрик

person Community    schedule 19.07.2009

Я думаю, что ваша проблема может заключаться в том, что ответ - это не XML-документ, а обычная строка. Попробуйте изменить оператор рендеринга на что-то вроде:

render :xml => { :error => "ERR_only_2_users_allowed" }, :status => :unprocessable_entity
person Corey    schedule 29.05.2009