Rails中如何将Mobility翻译从基础数据导入用户自定义数据?
解决Mobility翻译内容从基础模型导入自定义模型的问题
问题根源
直接调用categori_locale_backend.write仅在内存中操作了Mobility的翻译存储层,并未触发ActiveRecord的变更追踪与持久化逻辑,因此翻译内容无法写入数据库。Mobility的标准用法是通过模型的翻译属性赋值接口操作,而非直接调用底层backend方法。
正确实现步骤
首先确保UserCategori已正确配置Mobility翻译属性(需匹配你的Mobility版本及backend类型):
class UserCategori < ApplicationRecord # 基础配置示例(根据实际backend调整) translates :name_locale, type: :string # 若使用key-value类型backend,写法如下: # mobility :name_locale, type: :string, backend: :key_value end
然后修改导入逻辑,通过模型属性赋值并触发保存:
categori = Categori.find(params[:categori_id]) @user_categori = UserCategori.create(sequence: categori.sequence, name: categori.name) I18n.available_locales.each do |locale| # 直接为对应语言环境的name_locale赋值 @user_categori.name_locale(locale => categori.name_locale(locale: locale)) end # 一次性保存所有翻译变更 @user_categori.save!
更高效的写法(创建时完成所有赋值)
若无需先创建主记录再补翻译,可在初始化阶段完成所有赋值:
categori = Categori.find(params[:categori_id]) @user_categori = UserCategori.new(sequence: categori.sequence, name: categori.name) I18n.available_locales.each do |locale| @user_categori.name_locale(locale => categori.name_locale(locale: locale)) end @user_categori.save!
验证注意事项
- 确认
I18n.available_locales包含所有需要同步的语言环境 - 检查
categori.name_locale(locale: locale)能正常返回对应语言的翻译内容 - 确保
UserCategori的数据库表(或关联翻译表)存在对应语言环境的存储结构
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

