2012-11-27 45 views
1

我的Rails應用程序目前使用collection_select來選擇下拉菜單等,這有兩個好處查找值:可以使用collection_select來對付yaml文件嗎?

  1. 的值是一致的
  2. 選定值的ID存儲在數據庫中,而不是文本值

例如: edit.html.erb

<div class="field"> 
    <%= f.label :course_type %><br /> 
    <%= f.collection_select :course_type, Lookup.find(:all,:conditions => ["model_name = 'course' and field_name = 'course_type'"]), :id, :lookup_text, include_blank: false,:prompt => "Course Type" %> 
</div> 

course_controller.rb

private 
    def get_lookups 
    @course = Course.find(params[:id]) 
    @course_type = Lookup.find(@course.course_type).lookup_text 

show.html.erb

<b>Course type:</b> 
<%= @course_type %> 

我的應用程序將是多語言,和Rails使用環境文件處理此。

現在的問題是:是否有可能(而且合理)從yml文件而不是模型/表中填充查找值,並且這可以輕鬆擴展以處理多種語言?上述代碼如何被基於yml的代碼替換?

回答

6

一個解決方案是保留在DB中的翻譯,也許與我們的Traco庫。我懷疑它會與collection_select一起使用。

如果你想從你的翻譯YML文件中提取選項,我建議options_for_select。所有的一切是這樣的:

en.yml

en: 
    my_options: 
    one: "Option 1" 
    two: "Option 2" 

查看:

select_tag :foo, options_for_select(t("my_options").invert) 

Rails的國際化給你一個哈希值,如果你翻譯一個非葉鍵,如「 my_options」。您需要invert,因爲options_for_select需要值之前的文本,而翻譯哈希是相反的方式。

+0

謝謝你的選擇。我會考慮Traco。看來options_for_select會返回一個文本值,然後寫入數據庫字段。來自3NF數據庫的背景,我可以看到一些問題 - 主要是存儲過多的數據。我會接受你的回答:謝謝。 – ardochhigh

+0

這太複雜了,實際上可以使用collection_select和.yml轉換(不帶數據庫)。 – TomDogg

+0

感謝.invert – sandre89

1

若要翻譯collection_select,您只需創建一個新的模型的方法(比方說, 「name_translated」)從YAML文件返回您的翻譯:

查看:

<%= f.collection_select :product_id, Product.all, :id, :name_translated %> 

型號:

class Product < ActiveRecord::Base 
    def name_translated 
    I18n.t(name) 
    end 
end 

YAML文件:

en: 
    name1: "Hammer" 
    name2: "Plastic sheets" 
    name3: "Duct tape" 
+0

如果DB在數據庫變更時需要更改,我仍會建議將其存儲在數據庫中,以減少數據庫漂移的風險。我正在編輯你的答案只是爲了澄清一下;讓我知道你是否介意。 –

0

我用select:

<%= f.select :role, MAIN_CONFIG['manager_roles'].map { |s| [s.last, s.first] }, selected: @manager.role %> 

我的YAML文件main_config。yml:

manager_roles: 
    admin: 'Суперадмин' 
    partner_admin: 'Администратор' 
    manager: 'Менеджер' 
相關問題