【问题标题】:How to get an array of values from a group of checkbox in Ruby on Rails?如何从 Ruby on Rails 中的一组复选框中获取一组值?
【发布时间】:2022-10-15 22:31:33
【问题描述】:

我是 Rails 新手,我不明白如何解决这个问题。

我有 2 个实体:Player 和 Call Up; N:M 关系。所以基本上一个调用有一个id,一些属性(如对手,日期......)和一个球员名单。

在新的征召表中,我添加了一个可以包含的球员表。每行都有带有相应玩家 ID 的复选框。这是视图:

<%= form_with(model: call_up) do |form| %>
<!--Call Up Informations-->
<!---->
  <table class="table">
    <thead>
      <tr>
        <th colspan="5"></th>
      </tr>
    </thead>
    <tbody>
      <% @players.each do |player| %>
        <tr>
          <td><%=player.first_name %></td>
          <td><%=player.last_name %></td>
          <td><%=player.number %></td>
          <td><%=player.role %></td>
          <div class="field">
            <td><%=form.check_box :player_ids, class: "form-check-input", value: player.id %></td>
          </div>
        </tr>
      <% end %>
    </tbody>
  </table>

  <br>

  <div class="actions text-center">
    <%= form.submit "Create Call Up", class: "btn btn-dark" %>
  </div>
<% end %>

在控制器中,我尝试使用params[:player_ids] 获取播放器ID 数组,但它会产生零错误。 谁能帮我吗?

【问题讨论】:

    标签: ruby-on-rails ruby forms model-view-controller checkbox


    【解决方案1】:

    有时挖掘源代码对我们有很大帮助,尤其是当指南不清楚时。看看all check_box params

    def check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")
      Tags::CheckBox.new(object_name, method, self, checked_value, unchecked_value, options). 
    end
    

    这里你的form.check_box 在一个对象的form_with 下,所以object_name 是对象名称call_upmethod 这是你要发布的对象参数player_idschecked_valueunchecked_value 是值当用户提交表单时,这些参数将作为每个复选框[0, 1, 0, 1, ...] 的备用选中/未选中数组发送,如果您只想发送选中的值,只需设置unchecked_value = nil

    <td><%=form.check_box :player_ids, {multiple: true, skip_default_ids: false, class: "form-check-input"}, player.id, nil %></td>
    

    还有一件事,您的控制器将收到 has params object_name =&gt; {..., method: [...]},因此您需要 permit 该数组:

    def call_up_params
      params.require(:call_up).permit(:name, player_ids: [])
    end
    

    【讨论】:

      【解决方案2】:

      在这里,您可以在点击或单击玩家 ID 时进行多个复选框和更好的用户体验/界面,复选框将被选中。

      <% @players.each do |player| %>
      
        <div class="form-check">
          <%= hidden_field_tag "call_up[player_ids][]", nil %>
      
          <%= check_box_tag "call_up[player_ids][]", player.id, call_up.player_ids.include?(player.id), id: dom_id(player), class: 'form-check-input', type: "check-box", multiple: true %>
      
          <%= label_tag dom_id(player), class: 'form-check-label' do %>
            <%= player.id %>
          <% end %>
      
        </div>
        
      <% end %>
      

      【讨论】:

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