2013-09-22 98 views
0

我正在Ruby 2.0上運行Rails 4從鍵值對獲取鍵名

我正在嘗試用我的模型中安裝的鍵值對數組填充選擇標記。但是,我很難弄清楚如何抓住鑰匙。以下是我迄今爲止:

型號

class Store 
    Colors = ['blue', 'green', 'red', 'yellow', 'orange', 'pink', 'purple', 'lime', 'magenta', 'teal'] 
    SearchParams = {'isbn' => 'ISBN', 'intitle' => 'Title', 'inauthor' => 'Author', 'inpublisher' => 'Publisher', 'subject' => 'Subject', 'lccn' => 'LCCN', 'oclc' => 'OCLC'} 
end 

控制器

def index 
    @search_params = Store::SearchParams.map { |param| [param, param.key] } 
end 

注:據我所知,.key不存在 - 我補充說,希望它會更好傳達我想要做的事情。

查看

<%= form_tag do %> 
    <%= select_tag :param_name, @search_params, prompt: 'choose' %> 
<% end %> 

我希望每個<option>的價值是關鍵,併爲用戶看到的值。我希望這是有道理的。

回答

2

你一般使用options_for_select來提供select_tag的選項。方便的是,可以用手一個哈希options_for_select,它會做正確的事:

options_for_select(容器,選擇=無)

接受容器(散列,數組,枚舉,你的類型)並返回一串選項標籤。 [...]

的問題是,options_for_select想哈希的關鍵是人看到的和值是爲<option> S中value屬性。你的散列是倒退,但你可以使用Hash#invert左右翻轉鍵和值:

反轉→new_hash

返回使用hsh的值作爲鍵來創建一個新的哈希值,並且按鍵爲值。

所以,你可能只是這樣做在你的控制器:

@search_params = Store::SearchParams.invert 

,然後這個在ERB:

<%= select_tag :param_name, options_for_select(@search_params), prompt: 'choose' %> 
+0

釘了它 - 謝謝! – drewwyatt

1

我想,這本身將工作

高清指數 @search_params =商店:: SearchParams.to_a //它將返回你想要的陣列,但值會[鍵1,值1] [key2,value2]] //如果你想逆轉它然後Store :: SearchParams.to_a.collect {| arr | arr.reverse}將給出 結束

1

這將做到這一點:

def index 
    @search_params = Store::SearchParams.map { |key, val| [val, key] } 
end 

UPD:還考慮Hash#invert(感謝@mu太短)

+1

http://ruby-doc.org/core-2.0。 0/Hash.html#method-i-invert –