Шаблон для перевода ошибок проверки ActiveRecord в ответы API - PullRequest
2 голосов
/ 20 января 2012

У меня есть приложение Rails 2.x, для которого я создаю интерфейс RESTful.

По какой-то (веской) причине я решил открыть некоторые поля в моих моделях ActiveRecord черезAPI использует имена, отличные от базовых полей в MySQL.

Например, многие поля MySQL имеют префикс имени модели (user_type, user_first_name и т. Д.).В моих запросах / ответах используются имена без префиксов (type, first_name).

Методы действий выглядят так (и да, это уже источник боли при обслуживании)

def create 
  u = User.new
  u.user_type = params[:type]
  u.user_first_name = params[:first_name]
  u.save!
end

Myпроблема возникает при спасении ActiveRecord :: RecordInvalid.Я перевожу коллекцию ошибок в записи в ключ, который может иметь смысл в клиентском приложении.Например:

validation_error.blank.user_first_name

через:

rescue_from ValidationError, ActiveRecord::RecordInvalid do |e|
  errors = []
  e.record.errors.each_error do |attr, error|
    errors << {:key => "validation_error.#{error.type.to_s}.#{attr}"}
  end
  errors.uniq!
  respond_to do |format|
    format.xml { render_xml_error errors, :unprocessable_entity}
  end
end

Проблема заключается в том, что «user_first_name» не было полем, о котором клиентский код знает что-либо - да, вы можете понятьэто потому, что вы человек, но оно не совпадает ни с одним из полей, которые были переданы точно

Итак, более общий вопрос: как я могу поддерживать этот тип несоответствующего сопоставления между моим публичнымФасад API и лежащая в его основе модель SQL без рукопашного боя с каждым методом действия и спасением от ошибок при переводе имен полей?

Поможет ли мне переключение на Rails 3 в этом конкретном отношении?

Одна из предложенных идей заключалась в том, чтобы поддерживать отдельный файл локализации I18n (en.yml) для ресурсов API, чтобы я мог отображать имена полей - но это все еще кажется тяжелым и хрупким

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...