Состояние ошибки активного ресурса и тело ответа - PullRequest
0 голосов
/ 26 марта 2009

Я делаю активный ресурсный вызов в службу, и мне хотелось бы получить несколько пользовательских сообщений об ошибках в качестве обратной связи. У меня есть некоторые проверки, которые не являются обычными проверками моделей, поэтому я не могу просто вернуть @ 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, и я получил сообщение об ошибке в теле сообщения об ошибке, но это, кажется, лишает нас цели иметь коды ответа об ошибке.

Я могу поместить весь запрос от клиента в блок start / rescue

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

но когда я ловлю ответ 422 (unprocessable_entity), я ничего не получаю от тела, поэтому я не получаю свое сообщение об ошибке. ответ = ноль

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

Ответы [ 2 ]

4 голосов
/ 19 июля 2009

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

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

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

Я должен был добавить это к продавец / Перила / activeresource / Библиотека / 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, и посмотрите, какой именно метод он вызывает. Затем добавьте что-то вроде того, что у меня есть, и вам будет хорошо.

Не спрашивайте меня, почему ребята из активных ресурсов считают, что валидация должна работать только с их методом сохранения. метод save создает или обновляет, но вызов 'put or post' - это то же самое, IMO. Если мы хотим, чтобы проверки работали над сохранением, мы хотим, чтобы они работали над положением и отправкой ... в любом случае, сделайте это.

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

0 голосов
/ 29 мая 2009

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

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