使用find_or_create_by填充数据库时value字段出现乱码问题
解决i18n Translation模型value字段出现YAML格式内容的问题
咱们先搞清楚为啥会出现这个情况:你用的i18n库的Translation模型,默认会对value字段做YAML序列化处理。当你直接用first_or_create传字符串'a'的时候,模型会自动把这个字符串转成YAML格式存起来,就出现了你看到的--- a...这种带YAML标记的内容,这并不是乱码哦。
下面给你两种解决办法,优先推荐第一种:
方法1:用i18n官方提供的API(最靠谱)
i18n本身就有专门的方法来添加或更新翻译,它会自动处理序列化的逻辑,完全不用你操心手动操作模型的问题,效果和你想要的first_or_create一模一样——不存在就创建,存在就更新。把你当前的代码换成下面这个就行:
# 存储英文翻译:键是A0000,值是a I18n.backend.store_translations(:en, { A0000: 'a' })
执行这个之后,去数据库看value字段,就是纯纯的'a',不会有那些奇怪的YAML标记了。
方法2:非要直接操作Translation模型的话(不推荐)
如果因为某些原因必须用first_or_create,那你得手动处理序列化的问题。因为Translation模型里有一行serialize :value的配置,它会把传入的内容转成YAML。要是想让数据库里存纯字符串,你可以修改模型的序列化规则,比如改成serialize :value, String,但这种做法可能会影响其他地方的i18n功能,所以非常不建议这么干。
最后再给你两个小检查点:
- 确认你的
Translation模型里确实有serialize :value这行代码,这就是问题的根源; - 你的
value字段是varchar(255),存短字符串没问题,要是以后存长文本可以改成text类型,但这个和当前的YAML标记问题无关。
内容的提问来源于stack exchange,提问作者Melih
相关产品推荐
相关产品推荐

