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