使用Mobility gem回退机制时如何获取返回的语言?
获取Mobility回退机制实际使用的语言
刚好我之前也折腾过Mobility的回退逻辑,要拿到实际返回值对应的语言来设置Content-Language头,其实有两种很靠谱的方法,直接用Mobility内置的能力就行:
方案1:用Backend的resolve方法(最推荐)
Mobility的每个后端都自带了resolve方法,它的作用就是帮你找到实际能读取到值的那个locale,而不是只返回值本身。用法很简单:
# 先设置好当前locale和回退列表 Mobility.locale = :ja fallback_list = [:nl, :de] # 第一步:找到实际生效的locale actual_locale = resource.description_backend.resolve(fallback_list) # 第二步:用这个locale读取对应的值(结果和你之前调用`description(fallback: ...)`一致) actual_value = resource.description_backend.read(actual_locale) # 现在就可以放心设置响应头了 response.set_header("Content-Language", actual_locale.to_s)
这个方法的好处是完全复用Mobility内部处理回退的逻辑,不会出现和你原本调用结果不一致的情况,非常可靠。
方案2:封装成模型辅助方法
如果觉得每次写两行麻烦,你可以给模型加个辅助方法,一次性返回值和对应的locale,用起来更顺手:
class YourResource < ApplicationRecord translates :description, backend: :key_value # 这里根据你实际用的后端调整 def description_with_locale(fallback: []) resolved_locale = description_backend.resolve(fallback) [description_backend.read(resolved_locale), resolved_locale] end end
之后用的时候就一行搞定:
content_value, content_locale = resource.description_with_locale(fallback: [:nl, :de]) response.set_header("Content-Language", content_locale.to_s)
补充说明
不管你用的是key_value、table还是其他Mobility后端,resolve方法都是通用的——这是Mobility定义的后端标准接口,所以不用担心兼容性问题。它会严格按照你指定的回退顺序(包括当前设置的Mobility.locale)去查找第一个有非空值的locale,完全符合你的预期逻辑。
内容的提问来源于stack exchange,提问作者Thollsten
相关产品推荐
相关产品推荐

