【发布时间】:2016-01-07 08:06:47
【问题描述】:
我有一个包含两种语言内容的表格。然后我有一个名为'语言'的列来区分。现在我使用I18n做多语言网站。那么,我怎样才能以当前语言获取数据库中的内容?
我想如果我可以设置模型的default_scope accoding 为语言,或者加载不同的模型同名。
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby
我有一个包含两种语言内容的表格。然后我有一个名为'语言'的列来区分。现在我使用I18n做多语言网站。那么,我怎样才能以当前语言获取数据库中的内容?
我想如果我可以设置模型的default_scope accoding 为语言,或者加载不同的模型同名。
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby
您可以使用 URL 参数来设置请求的应用程序区域设置,例如:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
按当前语言环境查找模型:
YourContent.where(name: some_name, language: I18n.locale)
并在带有字符串文件的视图中使用t 方法,因为您已设置应用程序区域设置。
docs 有其他几个例子。
是的,您可以使用default_scope { language: I18n.locale } 省略多余的where,但请注意default_scope 的caveats。
【讨论】:
如果你想为同一个模型有条件地切换到不同的表,你可以使用ActiveRecord::Base.table_name类方法。
例子:
cTable4 ❯ rails c -e production
Running via Spring preloader in process 60375
Loading production environment (Rails 4.2.4)
irb(main):001:0> Book.first
Book Load (0.1ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT 1
=> #<Book id: 1, name: "ELoquent Ruby", author: "Russ", year: "2011", created_at: "2016-01-07 08:40:47", updated_at: "2016-01-07 08:40:47">
irb(main):002:0> Book.table_name = 'titles'
=> "titles"
irb(main):003:0> Book.first
Book Load (0.2ms) SELECT "titles".* FROM "titles" ORDER BY "titles"."id" ASC LIMIT 1
=> #<Book id: 1, title: "Practical OOD Ruby", author: "Sandi Metz">
irb(main):004:0>
【讨论】: