【发布时间】:2009-10-05 13:47:03
【问题描述】:
我想在站点用户编辑/创建页面中进行语言选择下拉菜单。
为此,我当然已将网站翻译成不止一种语言。 使用 I18n.available_languages,我可以得到一组语言环境代码,就像这样
development environment (Rails 2.3.4)
> I18n.available_locales
=> [:en, :da]
此外,我创建了一个语言模型并将其与用户相关联:
# app/models/language.rb
class Language < ActiveRecord::Base
has_many :users
end
# app/models/user.rb
class User < ActiveRecord::Base
belongs_to :language
end
# db/schema.rb
create_table "languages", :force => true do |t|
t.string "name"
t.string "code"
end
create_table "users", :force => true do |t|
t.integer "language_id"
end
然后语言表包含一个语言环境代码和一个母语的语言名称,如下所示:
| id | name | code |
------------------------------------
| 28 | Dansk | da |
| 29 | Nederlands | nl |
| 30 | English | en |
| 31 | Esperanto | eo |
然后我在用户新建、创建和编辑操作中有以下分配:
# app/controllers/users_controller.rb (extract)
@available_languages = I18n.available_locales.collect {|language_code| Language.find_by_code(language_code.to_s)}
我在视图中这样使用('available_languages' 是一个局部变量,因为来自控制器的@available_languages 已被传递给部分变量):
# app/views/users/_form.haml (extract)
= f.collection_select(:language_id, available_languages, :id, :name, {:prompt => true})
所有这一切的结果是,用户将获得一个区域选择下拉菜单来定义给定用户的区域。
我的问题是: 有没有一种干净的方法可以将 @available_languages 分配从 UsersController 中移出并进入 Language 模型,所以我可以缩短这个:
@available_languages = I18n.available_locales.collect {|language_code| Language.find_by_code(language_code.to_s)}
到这样的事情:
@available_languages = Language.translations_available
【问题讨论】:
标签: ruby-on-rails internationalization named-scope