用于将ActiveRecordvalidation错误转换为API响应的模式

我有一个Rails 2.x应用程序,我正在构建一个RESTful接口。

出于一些(好的)原因,我选择使用与MySQL中的基础字段不同的名称通过API公开我的ActiveRecord模型上的一些字段。

例如,我的很多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 

救援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 < "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会在这方面帮助我吗?

建议的一个想法是为API资源维护一个单独的I18n本地化文件(en.yml),以便我可以映射字段名称 – 但仍然感觉很重且很脆弱