ruby-on-rails – 将可用语言与语言名称匹配
我想在站点用户编辑/创建页面中进行语言选择下拉列表.
为此,我当然将网站翻译成多种语言. 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 = I18n.available_locales.collect {|language_code| Language.find_by_code(language_code.to_s)} 这样的事情: @available_languages = Language.translations_available 解决方法
在我看来,你正在做一些有趣的事情.首先,以下是一些问题:
I18n.available_locales.collect {|language_code| Language.find_by_code(language_code.to_s)} 此设置使您为每个可用的语言环境生成一个SQL查询.此外,如果I18n.available_locales中的每个语言环境都有相应的Language对象,反之亦然,那么这段代码似乎有点不必要.你也可以这样做: Language.find(:all) # or even Language.all 如果由于某种原因,他们没有直接映射,你可以使用它: Language.all(:conditions => { :code => I18n.available_locales }) 更冗长的形式相当于: Language.find(:all,:conditions => ["code IN (?)",I18n.available_locales]) 这将找到代码列在I18n.available_locales中的所有语言.如果需要此方法的快捷方式,可以使用named_scopes: class Language < ActiveRecord::Base has_many :users named_scope :translation_available,:conditions => { :code => I18n.available_locales } end 有了这个,你可以调用: Language.translation_available 我想这就是你想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |