如何根据Rails中的上下文更改可读属性?

时间:2018-09-19 16:02:20

标签: ruby-on-rails ruby-on-rails-5

我知道我可以在区域设置文件中更改ActiveRecord名称,但是有一种方法可以根据上下文而不是区域设置来更改它们(同时仍在应用程序中使用区域设置文件)?

举一个简单的例子(在多种情况下,我需要完成此操作),如果我在向导中有一个地址表单,并且用户选择了一个国家,那么如何更改{{1 }}属性可向选择美国的人显示override fun attachBaseContext(newBase: Context?) { super.attachBaseContext(newBase) SplitCompat.install(this) } ,向选择英国的人显示:zipcode

编辑:我的意思是,当模型属性(国家/地区)更改时,如何根据国家/地区选择来更改(邮政编码)的人类可读属性。用户的语言环境不会改变(我已经在使用语言环境文件进行翻译了。)

2 个答案:

答案 0 :(得分:1)

最好的本地化方法是使用I18n,请查看此帖子:https://guides.rubyonrails.org/i18n.html#setup-the-rails-application-for-internationalization

基本I18n

首先在您的application.rb控制器中添加语言环境

config.i18n.available_locales = ["en-GB",  "en-US"]
config.i18n.default_locale = "en-US"

然后在en-US.yml下创建2个文件en-GB.ymlconfig/locales

# en-GB.yml
en-Gb:
  zipcode: "PostCode"

# en-US.yml
en-US:
  zipcode: "ZipCode"

然后在您的控制器中,您需要设置将用于翻译的词典。它由I18n.locale变量定义。

# example when locale is passing through params
before_action :set_locale

def set_locale
  I18n.locale = I18n.available_locales.include?(params[:locale]) ? params[:locale] : I18n.default_locale
end

最后在您看来:     <%= t('邮政编码')%>

或者如果您需要红宝石文件:

I18n.t('zipcode')

本地化ActiveRecord属性

与上述相同,您可以在config/locales下创建一个active_record.en-US.yml

# active_record.en-US.yml
en-US:
  activerecord:
    attributes:
      your_model_name:
        zipcode: 'ZipCode'

答案 1 :(得分:0)

我接受了另一个答案,因为我最终使用语言环境文件作为解决方案的一部分。

但是,我的做法有点古怪:

  1. 在必要的请求之前将语言环境设置为{language}-{selected_country}
  2. 必要时,在那些YAML文件中具有特定的替代,并尽可能地降低为基本语言文件中的标准属性。
  3. alias_attributes中使用FormObject,以最大限度地减少对上述黑客的需求。