Я новичок в Rails и не понимаю, как решить эту проблему.
У меня есть 2 сущности: Player и Call Up; Отношения Н:М. Таким образом, у призыва есть идентификатор, некоторые атрибуты (например, противники, дата...) и список игроков.
В новой форме вызова я добавил таблицу игроков, которых можно включить. В каждой строке есть флажок с соответствующим идентификатором игрока. Вот вид:
<%= 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]
, но это привело к нулевой ошибке.
Может кто-нибудь мне помочь?
Иногда нам очень помогает копание в исходном коде, особенно когда руководство непонятно. Взгляните на все параметры check_box
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_up
, method
вот какие параметры объекта вы хотите опубликовать player_ids
, checked_value
и unchecked_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 object_name => {..., method: [...]}
, поэтому вам нужно permit
этот массив:
def call_up_params
params.require(:call_up).permit(:name, player_ids: [])
end