サイトユーザーの編集/作成ページで言語選択ドロップダウンを作成したい。
この目的のために、私はもちろんサイトを複数の言語に翻訳しました。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 |
次に、User new、create、editアクションに次の割り当てがあります。
# 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