用于将ActiveRecord验证错误转换为API响应的模式

时间:2012-01-19 21:50:29

标签: ruby-on-rails activerecord

我有一个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 << {: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会在这方面帮助我吗?

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

0 个答案:

没有答案