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>成为键,并让用户看到值。我希望这是有道理的。

4

3 回答 3

2

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

options_for_select(容器,选定 = nil)

接受一个容器(哈希、数组、可枚举、你的类型)并返回一个选项标签字符串。[...]

问题是options_for_select希望哈希的键是人类所看到的,而值是 s 的value属性<option>。您的 Hash 是向后的,但您可以Hash#invert用来翻转键和值:

反转 → new_hash

返回使用hsh的值作为键创建的新哈希,并将键作为值。

所以你可以在你的控制器中这样做:

@search_params = Store::SearchParams.invert

然后在ERB中:

<%= select_tag :param_name, options_for_select(@search_params), prompt: 'choose' %>
于 2013-09-22T04:26:36.270 回答
1

我认为,这本身会起作用

def index @search_params = Store::SearchParams.to_a //它会返回你想要的数组,但是值将是 [[key1,value1],[key2,value2]] // 如果你想反转它然后存储: :SearchParams.to_a.collect{|arr| arr.reverse} 将结束

于 2013-09-22T04:22:06.007 回答
1

这样就可以了:

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

UPD:也考虑一下Hash#invert(感谢@mu太短)

于 2013-09-22T04:25:58.533 回答