2014-11-14 30 views
1

我有常數像Rails4 - 如何訪問視圖中的常量並正確顯示它們?

應用程序/模型/ user.rb按照我的用戶模型

GENDER_TYPES = [['Male', false], ['Female', true]] 
COUNTRY_TYPES = [["Afghanistan",1],["Aland Islands",2],["Albania",3]..] 

在視圖,如用戶註冊頁面我訪問它們如下

<div> 
    <%= f.label :is_female, "Gender" %> 
    <%= f.select :is_female, User::GENDER_TYPES , {}, { :class => 'form-control' } %> 
    </div> 

    <div> 
    <%= f.label :country, "From" %> 
    <%= f.select :country, User::COUNTRY_TYPES , {}, { :class => 'form-control' } %> 
    </div> 

這是我的部分用戶型號爲

class AddAdminToUsers < ActiveRecord::Migration 
    def change  

    add_column :users, :is_female, :boolean, default: false 
    add_column :users, :country, :integer 

    end 
end 

當用戶註冊時,我是能夠將數據存儲在表格中。 但是,當我顯示視圖的用戶,我使用這樣的性別

<% if user.is_female %> 
    <small>Female</small> 
    <% else %> 
    <small>Male</small> 
    <% end %> 

而且我不知道如何做到這一點的國家。 我知道必須有更好的方式來做到這一點。

有人可以分享如何顯示具有上述數據結構的用戶性別和國家嗎?

回答

2

假設你在常量牽着你的數據定居,這裏有幾個技巧:

  • 使用哈希:COUNTRIES = {1 => "Afghanistan"},你可以很容易地在必要時將其轉換成雙陣列,您可以輕鬆地查找價值觀兩種方式:
<% if user.country %> 
    <%= User::COUNTRIES[user.country] %> 
<% end %> 
  • 使用助手
def coutries_for_select 
    # assuming countries is a hash id => name 
    User::COUNTRIES.map {|id, name| [name, id]} 
end 
1

可能不是完美的,但會做的工作

<%= User::COUNTRY_TYPES.map(&:reverse).to_h[user.country] %> 

這是更好地在國家保存在另一個表,並引用它。

+0

感謝:呈現,而不是參考模型常數原始數據直接,當你想要做翻譯這是演示的一部分,而不是業務邏輯,也是有用的。我會試試這個。但我採取了這種方法,以便我可以停止數據庫訪問。我有一個觀點,用戶可以看到所有其他用戶。我想如果我將國家保存在數據庫中,那麼每個用戶都可以訪問數據庫。例如,如果一個頁面顯示30個用戶,那麼通過30個數據庫訪問不會有嗎?對不起,我是一個新手。如果我錯了,請糾正我。 – LovingRails 2014-11-14 13:10:42

+0

@LovingRails你是半正確的,你所描述的被稱爲N + 1問題,rails允許你避開它:'User.includes(:countries).all',將生成2個數據庫查詢並將相應的國家每個選定的用戶。更多細節在這裏:https://www.codemy.net/posts/optimizing-your-rails-app-part-1-n-1-queries – keymone 2014-11-14 13:17:07

+0

當你獲取用戶時,你可以急切地加載國家,這將限制查詢數量爲2。 – Santhosh 2014-11-14 13:17:47

相關問題