如何在Jbuilder JSON响应中结合Mobility gem输出对应语言的name属性?
解决Mobility Gem在JSON响应中输出对应语言name属性的方案
核心思路
Mobility默认通过name方法根据全局I18n locale返回翻译,但你的场景需要匹配关联Consumer的idiom语言,而非全局locale,因此需要手动指定目标语言获取对应翻译值。
具体实现方案
1. 直接在JSON响应中指定语言
利用Mobility提供的translate方法,传入Consumer关联的idiom语言代码:
# 假设transaction关联consumer,consumer的idiom字段包含code语言代码属性 json.label transaction.categoryminor.translate(:name, locale: transaction.consumer.idiom.code)
2. 模型层封装辅助方法(优化代码复用)
在Categoryminor模型中添加专用方法,统一处理语言匹配逻辑:
# app/models/categoryminor.rb def name_for_language(lang_code) translate(:name, locale: Mobility.normalize_locale(lang_code)) end
之后在JSON响应中直接调用:
json.label transaction.categoryminor.name_for_language(transaction.consumer.idiom.code)
3. 修正强参数写法
你之前的强参数代码存在语法错误,正确的动态生成翻译字段写法如下:
translated_params = I18n.available_locales.map do |l| "name_#{Mobility.normalize_locale(l)}".to_sym end # 后续可用于permit,例如: # params.require(:categoryminor).permit(*translated_params)
关键注意点
- 确保
idiom.code的值是Mobility兼容的标准语言代码(如en、zh-CN),若格式不匹配,可通过Mobility.normalize_locale方法统一转换。 - 使用
translate方法是Mobility官方推荐的手动指定locale方式,比直接调用name_en这类后缀字段更具兼容性。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

