【问题标题】:Rails 3 how to deal with constantsRails 3 如何处理常量
【发布时间】:2012-03-18 19:08:27
【问题描述】:

我在venue.rb 中有一个名为PAYMENT_METHODS 的常量。

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

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

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

提前致谢

【问题讨论】:

  • 您希望这些值改为什么?
  • 想到整数(1,2,3...)并且只将它们存储到数据库中。

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


【解决方案1】:

将常量设为哈希或数组,例如

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]

我一直觉得奇怪的是散列 key 是列表中显示的部分,但我认为值与选项的值相关联是有道理的 :-)。

【讨论】:

  • 谢谢,在选择标签上效果很好。但我需要一个解决方案,人们可​​以检查多种付款方式。
  • 我意识到这是你的问题,并添加了一个方法来做复选框:-)
【解决方案2】:

保存字符串值本身没有错。

最好创建一个类似PaymentType 的模型并保留id,name 并在视图中呈现所有付款类型。这样,您将来可以从管理面板(如果需要)更好地操作所有可用的付款选项,而不是去到代码级别并在常量处更改​​。

【讨论】:

  • thx,也考虑过,但这意味着数据库中多了一个表,因此流量更多。
【解决方案3】:

您可以使用元素的索引作为键。使用Array#index 对您有利。

PAYMENT_METHODS.index("Visa")   #=> 0
PAYMENT_METHODS[0]              #=> "Visa"

PAYMENT_METHODS.index("Diners") #=> 3
PAYMENT_METHODS[3]              #=> "Diners"

请注意:如果您重新排序 PAYMENT_METHODS,这将中断。您正在将一个元素键入到它在数组中的相对位置。更改数组并更改键。通过保持常量常量来避免麻烦。

【讨论】:

  • 您还可以添加虚拟属性来自动执行此过程。
【解决方案4】:

关于

我一直觉得哈希键是列表中显示的部分很奇怪,但我想值与选项的值相关联是有道理的:-)。

您可以通过以下方式完成(这也让我有些烦恼)

<% 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" />

干杯,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多