Я хочу сделать раскрывающийся список выбора языка на странице редактирования/создания пользователя сайта.
Для этой цели я, конечно же, перевел сайт более чем на один язык. Используя 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)}
который я использую в представлении следующим образом («доступные_языки» — это локальная переменная, поскольку @доступные_языки из контроллера были переданы частичному):
# app/views/users/_form.haml (extract)
= f.collection_select(:language_id, available_languages, :id, :name, {:prompt => true})
Результатом всего этого является то, что пользователь получит раскрывающийся список выбора локали, чтобы определить локаль для данного пользователя.
Мой вопрос: есть ли чистый способ переместить назначение @ available_languages из UsersController в языковую модель, поэтому я могу сократить это:
@available_languages = I18n.available_locales.collect {|language_code| Language.find_by_code(language_code.to_s)}
к чему-то вроде этого:
@available_languages = Language.translations_available