验证Rails中多个选择输入的哈希值

时间:2009-09-29 12:28:39

标签: ruby-on-rails ruby validation

previous question of mine

类似

我需要为投票偏好顺序验证一组选择输入。这次我不得不稍微改变一下。

用户的选项如下:

按优先顺序选择
1:[选择选项]
2:[选择选项]
3:[选择选项]

这会产生的哈希值如下:

[“1”=> “option-3”,“2”=> “option-1”,“3”=> “0”]

0是无选择的选择。

我有两个问题:

  1. 如何验证所选选项的唯一存在 - 因此不能有多个“option-2”,但可能有多个“0”(没有首选项)?

  2. 我如何验证以确保如果有人为第二个选择选择0,则他们在第三个选择中没有选项(因此使用如下数据:[“1”=>“选项 - 3“,”2“=>”0“,”3“=>”选项-1“])?

  3. 我一直在尝试各种各样的数组操作,但无法完成它。

2 个答案:

答案 0 :(得分:0)

我会做这样的事情:

valid = true
votes = (1..3).map{|x| params["select#{x}"]}
# Pass first condition
valid = false unless votes.uniq.length == votes.length
# Pass second condition
previous_is_zero = false
votes.each do |x| 
  unless x == 0 
   if previous_is_zero == true
     valid = false
     break
   else
     previous_is_zero = true
  end
end

答案 1 :(得分:0)

这听起来像是this railscast中所见的虚拟属性和嵌套表单的工作。

假设您的表单适用于具有多个投票的Ballot模型,您应该可以执行以下操作:

<%= form_for @ballot do %>
  Choose in order of preference:
  <% for votes in @ballot.votes %>
    <% fields_for "ballot[votes][]", vote do |vote_form| %>
      <%= vote_form.collection_select(:choice, vote.choices, :id %>
    <% end %>
  <% end %>
<% end %>

如果所有内容都是有效记录,您可以通过Ballot has_many :votes, :through => :castings, :uniq => trueCasting validates_uniqueness_of使用它来建立唯一性。如果不是,我会使用select而不是collection_select,然后您可以通过#uniq中的Ballot#votes=删除重复项。

希望这足以让你入门。完整实施将根据您当前数据模型的规范化程度而有所不同。