为什么'serialize'方法在Rails应用程序中从我的表单生成一个空数组?

时间:2018-06-18 07:52:29

标签: ruby-on-rails ruby simple-form

我在Rails应用程序中使用Simple Form Gem创建了一个包含各种输入字段的表单。其中一个问题是复选框输入字段,用户可以选择多个值,其中包含与饮食和生活方式相关的问题(你喝咖啡,吃白面包吗?等等)。在数据库中,相应的列(名为“tick”)是一个字符串输入字段。

我想做什么

我希望用户根据需要选择多个复选框,并在用户提交表单后在“显示”视图中显示这些选项。原始输出应该是一个数组,其数字对应于表单中选定的复选框。

我做了什么来实现这个

我使用了序列化方法https://apidock.com/rails/ActiveRecord/Base/serialize/class 尝试将输入保存为一个数组,该数组将在show视图中从数据库中检索。请参阅下面的模型和控制器中的实现。

究竟发生了什么

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

<p>
  <strong>Pon un tic en las Casillas si son aplicables en tu caso:</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 %>

Formularios模型,formulario.rb

class Formulario < ApplicationRecord
  serialize :tick, Array
end

我也尝试从

更改Formulario控制器中的params散列
..., :tick, ....

..., tick: [], ...

以及

..., (tick: []), ...

给出了语法错误“语法错误,意外',',期待=&gt;”

Formularios controller.rb

    class FormulariosController < ApplicationController
  before_action :set_formulario, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, only: [:show, :new]
  # before_action :user_signed_in?, only: [:show, :new]
  before_action :authenticate_admin, only: [:show, :index]

  # GET /formularios
  # GET /formularios.json
  def index
    @formularios = Formulario.all
  end

  # GET /formularios/1
  # GET /formularios/1.json
  def show
  end

  # GET /formularios/new
  def new
    @formulario = Formulario.new
  end

  # GET /formularios/1/edit
  def edit
  end

  # POST /formularios
  # POST /formularios.json
  def create
    @formulario = Formulario.new(formulario_params)

    respond_to do |format|
      if @formulario.save
        format.html { redirect_to @formulario, notice: 'Formulario was successfully created.' }
        format.json { render :show, status: :created, location: @formulario }
      else
        format.html { render :new }
        format.json { render json: @formulario.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /formularios/1
  # PATCH/PUT /formularios/1.json
  def update
    respond_to do |format|
      if @formulario.update(formulario_params)
        format.html { redirect_to @formulario, notice: 'Formulario was successfully updated.' }
        format.json { render :show, status: :ok, location: @formulario }
      else
        format.html { render :edit }
        format.json { render json: @formulario.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /formularios/1
  # DELETE /formularios/1.json
  def destroy
    @formulario.destroy
    respond_to do |format|
      format.html { redirect_to formularios_url, notice: 'Formulario was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private

  def authenticate_admin
    unless current_user.admin?
      redirect_to root_path
    end
  end

    # def authenticate
    #   authenticate_user! && current_user.admin?
    # end

    # Use callbacks to share common setup or constraints between actions.
    def set_formulario
      @formulario = Formulario.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def formulario_params
      params.require(:formulario).permit(:nombre, :fecha, :FdN, :direccion, :sexo, :email, :telefono, :movil, :profesion, :altura, :peso, :motivos, :especialistas, :dieta, :intolerancia, :detalles_1, :limites, :otro_1, :problema1, :p1, :p2, :p3, :problema2, :p4, :p5, :p6, :problema3, :p7, :p8, :p9, :problema4, :p10, :p11, :p12, :otro_2, :medicacion1, :m1, :m2, :m3, :m4, :m5, :m6, :medicacion2, :m7, :m8, :m9, :m10, :m11, :m12, :medicacion3, :m13, :m14, :m15, :m16, :m17, :m18, :otro_3, :suplemento1, :s1, :s2, :s3, :s4, :suplemento2, :s5, :s6, :s7, :s8, :suplemento3, :s9, :s10, :s11, :s12, :otro_4, :madre, :padre, :abuela_mat, :abuela_pat, :abuelo_mat, :abuelo_pat, :hermanos, :hermanas, :tios, :tias, :ninos, :sobrinos, :activa, :ejercicio1, :e1, :e2, :ejercicio2, :e3, :e4, :ejercicio3, :e5, :e6, :otro_5, :fumas1, :fumas2, :fumado, :alcol1, :alcol2, :alergia1, :alergia2, :habitos1, :habitos2, :habitos3, :habitos4, :galletas_tartas_bolleria, :leche, :huevos, :chocolates_dulces, :carne_roja, :carne_blanca, :pescado_blanco, :pezcado_azul, :carne_procesada, :pan, :te, :cafe, :refresco_lata, :agua, :verdura, :ensalada, :tick, :pecho, :dieta_sana, :motivacion, :desayuno1, :desayuno2, :desayuno3, :almuerzo, :almuerzo2, :almuerzo3, :cena1, :cena2, :cena3, :snacks1, :snacks2, :snacks3, :bebidas1, :bebidas2, :bebidas3)
    end
end

如何获取序列化方法来保存数组?或者是否有一种替代方法可以用来实现同样的目的?即记录在表格中选择了哪个复选框并在显示视图中显示它们。

0 个答案:

没有答案