从键值对中获取键名

时间:2013-09-22 04:01:37

标签: ruby-on-rails ruby

我在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>的值都是关键,并且用户可以看到该值。我希望这是有道理的。

3 个答案:

答案 0 :(得分:2)

您通常使用options_for_selectselect_tag提供选项。方便的是,您可以将哈希值交给options_for_select,它会做正确的事情:

  

options_for_select(container,selected = nil)

     

接受容器(散列,数组,可枚举,您的类型)并返回一串选项标记。 [...]

问题在于options_for_select希望Hash的键是人类看到的,而值是value的{​​{1}}属性。您的哈希值是向后的,但您可以使用Hash#invert来翻转键和值:

  

反转→new_hash

     

返回使用<option>的值作为键创建的新哈希,以及键作为值。

所以你可以在控制器中执行此操作:

hsh

然后在ERB中:

@search_params = Store::SearchParams.invert

答案 1 :(得分:1)

我认为,这本身会起作用

def index     @search_params = Store :: SearchParams.to_a     //它将返回您想要的数组,但值为[[key1,value1],[key2,value2]]     //如果你想要反转它,那么Store :: SearchParams.to_a.collect {| arr | arr.reverse}会给出这个 端

答案 2 :(得分:1)

那样做:

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

UPD :同时考虑Hash#invert(感谢@mu太短了)