2013-09-22 70 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 –