【问题标题】:Validate hash of multiple select inputs in Rails在 Rails 中验证多个选择输入的哈希
【发布时间】:2009-09-29 12:28:39
【问题描述】:

类似于previous question of mine

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

用户的选项类似于:

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

这将产生的哈希可能是这样的:

["1" => "option-3", "2" => "option-1", "3" => "0"]

0 是没有偏好的选择。

我有两个问题:

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

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

我一直在尝试各种数组操作,但无法完全解决。

【问题讨论】:

    标签: ruby-on-rails ruby validation


    【解决方案1】:

    我会这样做:

    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
    

    【讨论】:

    • 谢谢你 - 它看起来非常有用 - 但是你有 params["select#{x}"] - 这是否意味着我需要从这里的参数传递哈希?还是我需要传入每个选择项?实际的哈希是 params[:votes]
    • 我能理解的是你有 3 个 html 选择,我认为它们被命名为 select1、select2 和 select3,你从参数哈希中获取它们。
    【解决方案2】:

    这听起来像是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 =&gt; :castings, :uniq =&gt; trueCasting validates_uniqueness_of 使用它来建立唯一性。如果不是,我将使用select 而不是collection_select,然后您可以通过#uniq 中的#uniq 删除重复项。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多