如何使用不同的语言加载不同的模型?

时间:2016-01-07 08:06:47

标签: ruby-on-rails ruby

我有一个包含两种语言内容的表格。然后我有一个名为' language'区分。现在我用I18n做多语言网站。那么,如何用当前语言获取数据库中的内容?

我认为如果我可以根据语言设置模型的default_scope,或者为不同的模型加载相同的名称。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用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的{​​{3}}。

答案 1 :(得分:0)

如果要为同一模型有条件地切换到不同的表,可以使用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>