如何使用简单表单 Gem 从 Rails 应用程序中的复选框表单输入字段生成数组?

How do I generate an array from a checkbox form input field in Rails app using Simple Form Gem?

情况

我在 Rails 应用程序中使用简单表单 Gem 制作了一个包含各种输入字段的部分表单。其中一个问题是复选框输入字段,用户可以 select 多个值,其中包含与饮食和生活方式相关的问题(您喝咖啡、吃白面包吗?...等)。在数据库中,相应的列(名为 'tick')是一个整数输入字段。

我想做什么

我希望用户 select 根据需要选择尽可能多的复选框,并在用户提交表单后将这些选项显示在 'Show' 视图中。因此,显示视图可能会在问题列表旁边显示已选中和未选中框的列表,或者仅显示已选中的复选框。两者都合适。我感觉解决方案可能是以某种方式创建一个答案数组并在视图中显示结果,但到目前为止我还无法做到这一点。

实际发生了什么

一旦用户提交表单,他们将被重定向到 'show' 视图,其中相应的 html 输出只是“打勾”,没有给出实际答案。请参阅下面的 html 输出:

.
.
.
<p>
<strong>Tick:</strong>
</p>
.
.
.

表格部分:_form.html.erb

<%= simple_form_for(@formulario) do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if 
  f.object.errors[:base].present? %>
.
.
.
.
<%= f.input :tick,
    label:'Pon un tic en las Casillas si son aplicables en tu caso',
    collection: [
    ['padecido desorden alimentaria?', '1'],
    ['comes mucho lacteo o trigo?', '2'],
    ['te gusta comer/preparer comida?', '3'],
    ['compras comida ecológica?', '4'],
    ['añades sal a la comida?', '5'],
    ['tomas café o té descafeinado?', '6'],
    ['usas margarinas?', '7'],
    ['cocinas con aceites vegetales?', '8'],
    ['bebes agua filtrada?', '9'],
    ['has cambiado tu dieta ultimamente?', '10'],
    ['tomas té o café?', '11'],
    ['comes pan blanco?', '12'],
    ['comes mucho comida frita?', '13'],
    ['compras mucha comida para llevar?', '14'],
    ['comes mucha fruta y verdua fresca?  ', '15'],
    ['añades muchas salsas a la comida?', '16'],
    ['comes fuera a menudo?', '17'],
    ['cocinas para mas personas?', '18'],
    ['tienes apetito grande?', '19'],
    ['tu dieta es repetitiva?', '20'],
    ['comes pasta y arroz?', '21'],
    ['comes comida preparada?', '22'],
    ['usas el microondas?', '23'],
    ['eliges comida bajo en grasa?', '24'],
    ],
    as: :check_boxes %>
.
.
.
<% end %>

显示视图:show.html.erb

<p id="notice"><%= notice %></p>
.
.
.
<p>
  <strong>Tick:</strong>
  <%= @formulario.tick %>
</p>
.
.
.
<%= link_to 'Edit', edit_formulario_path(@formulario) %> |
<%= link_to 'Back', formularios_path %>

创建数组是前进的方向还是有更快的解决方案?

您可以 serialize 您的 tick 属性在您的数据库中存储一个数组。

如果 tick 属性是整数,运行 迁移以将其更改为字符串:

def change
  change_column :formularios, :tick, :string
end

序列化模型内的属性:

class Formulario < ApplicationRecord
  serialize :tick, Array
end

并允许 tick 强参数作为数组:

def formulario_params
  params.require(:formulario).permit(tick: [])
end

现在您的模型可以在 tick 中存储多个 "numbers",只需更改显示视图中的显示(@formulario.tick 现在 returns 类似于“['1', '2', '3']")