Rails 3如何处理常量

时间:2012-03-18 19:08:28

标签: ruby ruby-on-rails-3 forms constants has-and-belongs-to-many

我在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 %>

现在我想保存选择,但每个复选框的值是付款选项的名称。我想我必须以某种方式添加一个密钥只存储密钥。

如何设置密钥并将集合保存到数据库?

提前致谢

4 个答案:

答案 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" />

干杯,