今天写代码的时候,客服MM向我反馈了一个问题,这个问题本身是很容易解决的,但是出现这个问题时的提示信息有些令人郁闷,ActiveRecord的信息显示在页面时,只看到了一堆I18n无法找到相应语言下定义的提示信息。
但是我的应用支持中文和英文,我仔细检查了locales下的en.yml和zh-CN.yml,明明是有配置相应的提示信息的,却显示无法找到。一番检查之后,我认为问题在于文件加载先后顺序的地方出事了,提示信息,我是在类定义中写的,如下:
class EntryAttachment < Attachment
#不如惊讶,这是paperclip的方法
has_attached_file :archives,
:styles => { :p720x540 => '720x540>', :p120x90 => '120x90#', :p240x180 => '240x180#' }
#问题就出在这里了,这是在类定义的时候调用了 I18n,但是有可能在类定义的时候,Rails并没有加载 i18n 的yml资源文件
validates_attachment_size :archives, :less_than => 500.kilobytes,:message => I18n.t('attachments.validate.entry.size')
validates_attachment_content_type :archives, :content_type => ['image/png', 'image/x-png'],:message => I18n.t('attachments.validate.entry.content_type')
end
在development模式下,是可以正常工作的,在production模式下则会出现找不到相应语言的提示信息,但是不要忘记了 development 模式是热部署的,所有文件都会预加载,并且一旦修改,会立即加载的。
所以的这里的问题,就是在类定义的时候调用 I18n ,但是 I18n 的资源文件还没有加载,当然就无法找到相应语言的信息了。
同样地,我无法在类定义的时候就知道 locale ,I18n 的locale只能在运行的时候,根据不同的请求来判断是英文还是中文,然后设置 I18n.locale = ‘en' or 'zh-CN'
===============================
我用了一个比较笨的方法去替换掉 @obj.errors 的信息(当这两个验证 validates_attachment_size,validates_attachment_content_type 不通过时,错误信息会自动加到 @obj.errors 中去,这是标准的ActiveRecord使用方法)
在controller 中判断 @obj.errors 中是否含有 validates_attachment_size,validates_attachment_content_type 这两个验证的key,然后进行替换,但是 AcitveRecord::Errors比较白痴的是,没有提供remove某一个错误信息的方法,只能有一个 clear (全部清除)的方法,实现如下:
errors = []
@entry.errors.each do |attr,msg|
errors << [attr,msg]
end
@entry.errors.clear
errors.each do |i|
if i[0] == 'attachments.archives_file_size'.to_sym
@entry.errors.add_to_base I18n.t('attachments.validate.entry.size')
elsif i[0] == 'attachments.archives_content_type'.to_sym
@entry.errors.add_to_base I18n.t('attachments.validate.entry.content_type')
else
@entry.errors.add i[0],i[1]
end
end
这段代码写得比较烂了,不过它是有用的。
分享到:
相关推荐
ActiveRecord简单实例_activerecord.zip
关系注解使用自定义数据注释 ActiveRecord 关系对象,允许关系的元数据可用于自定义代码。安装将此行添加到应用程序的 Gemfile 中: gem 'activerecord-relations_annotations' , '~> 0.0.1' 然后执行: $ bundle...
将ActiveRecord中的NHibernate升级到3.3.0GA,排除编译的bug问题,保留ActiveRecord的完整功能,【Castle.ActiveRecord 升级NHibernate到3.4.0GA】的功能不完整!
Castle.ActiveRecord For .NET FrameWork 2.0 如果你想使用Castle.ActiveRecord,但又不想使用.NET Framework 3.0/3.5/4.0或更高版本,那么这个就是你所需要的,For .NET FrameWork 2.0,我整理了好久,自己从官方...
ORM的中文教程 英文的API 为什么是2分呢? 因为我很2 -_-!
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
CASTLE ACTIVERECORD学习实践(2):构建配置信息 CASTLE ACTIVERECORD学习实践(3):映射基础 CASTLE ACTIVERECORD学习实践(4):实现ONE-MANY关系的映射 CASTLE ACTIVERECORD学习实践(5):实现MANY–MANY关系...
Pro ActiveRecord Databases with Ruby and Rails.pdf
Castle.ActiveRecord官方已经停止更新了,官方最高支持到NHibernate 3.1.0.4000,这个版本还有不少问题(例如:[NH-2213] - CLONE -Wrong parameters order in IQuery with SetParameterList and Filter)。...
MyBatisPlus的ActiveRecord实现CRUD示例代码
userstamp, 这个 Rails 插件扩展ActiveRecord Userstamp插件( v-2.0 )概述Userstamp插件扩展了 ActiveRecord::Base,以添加对'创建者','更新程序'和'deleter'属性的自动更新。 它是基于 ActiveRecord::Timesta
Castle.ActiveRecord 的资料很多,但是WINFORM的没几个,于此我专门写了个例子献给初学Castle.ActiveRecord的童鞋们,希望这篇文档能够帮到你们。这个例子使用的是ACCESS数据库,从单表,一对多,多对多,数据绑定,...
ActiveRecord的model创建,常用的一些增删改查以及HQL的使用
scala-activerecord.zip,scala activerecord scalatraactiverecord类似于scala的orm库
C# Castle.ActiveRecord CS源码示例教程.zip
Castle ActiveRecord快速入门指南,ActiveRecord帮助文档
在yaml里面配置数据库信息,通过activerecord进行连接数据库 数据信息通过csv文档写入
ActiveRecord最终版,由于ActiveRecord引用了ISet集合,Iesi.Collections.3.4.1.4000以后已经把ISet去掉了,所以ActiveRecord引用的NHibernate的版本的更新只能到3.4.1.4000此为止。 引用其他资源版本如下: ...
ROR-ActiveRecord持久层框架的Java实现
SchemaPlus 提供增强和扩展ActiveRecord的集合