今天写代码的时候,客服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
这段代码写得比较烂了,不过它是有用的。
分享到:
相关推荐
在Ruby开发中,ActiveModel是Rails框架的一部分,它提供了一种模型层的接口,使得非ActiveRecord对象也能具有类似于ActiveRecord的行为。这个标题提到的"Ruby-ActiveModel的自定义验证用于检查数组是否包含在另一个...
在Ruby开发中,ActiveRecord是Rails框架的一部分,用于处理数据库操作和对象关系映射(ORM)。在用户注册或账户管理时,确保用户设置的密码具有足够的强度是非常重要的,以防止轻易被破解。这个资料包“使用...
总之,`Ruby-marginalia`是提升ActiveRecord应用开发效率和可维护性的强大工具,通过在SQL查询中添加注释,它提供了宝贵的上下文信息,使开发者能够更有效地管理和优化数据库交互。在进行性能优化或者调试时,`...
### Ruby on Rails中的ActiveRecord编程指南 #### 一、引言 在Ruby on Rails框架中,ActiveRecord是一种用于实现数据库抽象层的对象关系映射(ORM)工具。它为开发人员提供了一种简单而强大的方式来处理数据库记录...
你可以在表单提交后调用`validate(params)`方法来进行验证,如果验证失败,`errors`对象将包含所有的错误信息。而`submit`方法则可以用来处理表单的提交,成功时会返回一个包含所有数据的新实例,即使这些数据可能...
能够为关联定义自定义URI 类似于ActiveRecord的日志输出 API端验证的处理 可查询的名称! :) 组态 将此行添加到您的应用程序的Gemfile中: gem 'spyke' gem 'multi_json' # or whatever is needed to parse ...
如果验证失败,`ValidationErrors`属性会包含所有错误信息,可以用来向用户反馈问题。 总的来说,"castle简单小实例"涵盖了Castle ActiveRecord的模型定义和数据库操作,以及Castle Validation的数据验证。这两个...
接着,在应用中设置`config/mongoid.yml`以配置数据库连接信息,如主机、端口、数据库名等。 3. **Mongoid的基本使用** 在Ruby中定义一个Mongoid模型,只需要继承`Mongoid::Document`,并定义相应的字段。例如: ...
errors.add(:password, '必须包含字母、数字和符号') unless password =~ /[a-z]/i && /\d/.match?(password) && /[!@#$%^&*()]/.match?(password) end end ``` 这样的验证会确保密码的长度、确认以及复杂性。 ...
4. **错误处理**:当验证失败时,ActiveRecord会将错误信息添加到`errors`集合中。开发者可以遍历这些错误,向用户显示详细的信息。 5. **批量验证**:`valid?`方法可以用来一次性执行所有验证,如果所有验证都通过...
- **提取验证错误**: 通过`getErrors()`方法获取验证失败的信息。 - **特性标签**: 通过`attributeLabels()`方法设置字段的标签。 **2. 创建动作** - **功能**: 定义处理用户请求的动作方法。 **3. 创建表单** -...
- `validate`:自定义验证方法,确保价格至少为0.01元。 - `validates_uniqueness_of`:确保每本书的标题都是唯一的。 - `validates_format_of`:确保图片URL符合指定的格式(GIF、JPG或PNG)。 #### 四、视图层...