加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 将可用语言与语言名称匹配

发布时间:2020-12-17 01:55:13 所属栏目:百科 来源:网络整理
导读:我想在站点用户编辑/创建页面中进行语言选择下拉列表. 为此,我当然将网站翻译成多种语言. 使用I18n.available_languages,我可以得到一个区域代码数组,就像这样 development environment (Rails 2.3.4) I18n.available_locales = [:en,:da] 此外,我创建了一个
我想在站点用户编辑/创建页面中进行语言选择下拉列表.

为此,我当然将网站翻译成多种语言.
使用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并进入语言模型,所以我可以缩短它:

@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

我想这就是你想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读