我在PAYMENT_METHODS
中有一个名为venue.rb
的常量。
PAYMENT_METHODS = ['Visa', 'MasterCard', 'American Express', 'Diners', 'JCB', 'Bankomat', 'sodexo', 'MA-Gutscheine']
您可以在表单中检查/取消选中付款类型(payment_options
是整数):
<%= hidden_field_tag "venue[payment_options][]", nil %>
<% Venue::PAYMENT_METHODS.each do |category| %>
<%= check_box_tag "venue[payment_options][]", category %>
<%= label_tag category %>
<% end %>
现在我想保存选择,但每个复选框的值是付款选项的名称。我想我必须以某种方式添加一个密钥只存储密钥。
如何设置密钥并将集合保存到数据库?
提前致谢
答案 0 :(得分:2)
使常量为散列或数组,例如
PAYMENT_METHODS = {'Visa' => 1, 'MasterCard' => 2, 'American Express' => 3, 'Diners' => 4, 'JCB' => 5, 'Bankomat' => 6, 'sodexo' => 7, 'MA-Gutscheine' => 8 }
现在,这些格式可以传递给options_for_select
http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_for_select。
如果你(真的)想要复选框,一个数组就可以了,只需使用PAYMENT_MTHODS.each_index do |index|
循环获取一个值为的迭代器,然后使用PAYMENT_METHODS[index]
。
我总是觉得奇怪的是哈希键是列表中显示的部分,但我想这个值与该选项的值相关联是有道理的: - )。< / p>
答案 1 :(得分:1)
保存字符串值本身并没有错。
最好创建一个类似PaymentType
的模型,然后只保留id,name
并在视图中呈现所有付款类型。这样,您可以在以后更好地操作管理面板中的所有可用付款选项(如果需要)而不是去代码级别并改变常量。
答案 2 :(得分:0)
您可以将元素的索引用作键。使用Array#index
对您有利。
PAYMENT_METHODS.index("Visa") #=> 0
PAYMENT_METHODS[0] #=> "Visa"
PAYMENT_METHODS.index("Diners") #=> 3
PAYMENT_METHODS[3] #=> "Diners"
请注意:如果您重新排序PAYMENT_METHODS
,这将会中断。你正在键入一个元素到它在数组中的相对位置。更改阵列并更改密钥。通过保持常量不变来避免麻烦。
答案 3 :(得分:0)
关于
我总是觉得奇怪的是哈希键是列表中显示的部分,但我想这个值与选项的值相关联是有道理的: - )。
你可以完成这件事(这也让我感到烦恼)
<% Post::TECH_CATEGORY.each do |category| %>
<%= label_tag 'name', category[0] %>
<%= check_box_tag 'tech_cat', category[1] %>
<% end %>
现在我可以在屏幕上看到它。每个对象都有两个值,所以......
category[0]
将始终是您为当前枚举的特定对象提供的密钥
category[1]
将是同一个对象的值。在屏幕上看起来更好。
在上面的示例中看起来像
<label for="name"> Visa </label>
<input id="tech_cat" name="tech_cat" type="checkbox" value="1" />
干杯,