从rails 5.0.0.1中的日期范围生成多个模型行

时间:2017-06-28 23:04:42

标签: ruby-on-rails ruby

我希望从特定培训师表单中输入的选定日期的日期范围生成多个预定事件,Evento模型为:

class Evento < ApplicationRecord
  belongs_to :equipo
  has_many :asistencias, dependent: :destroy
  accepts_nested_attributes_for :asistencias
  scope :done, -> { where(registrado: true) }
  validates :equipo_id, :fecha, :tipoEvento, presence: true
end

所以我在“app / views / eventos / forma_prog.html.erb”中有一个视图,其中包含一个表单,用于获取参数以定义日期范围,如下所示:

<% provide(:title, "Entrenamientos") %>
<div class="col-sm-6 col-sm-offset-3">
  <p id="notice"><%= notice %></p>

  <h1>Programación de Entrenamientos</h1>

  <%= form_tag(programa_path) do %>
    <% dias = [] %>
    <%= label_tag(:entrenador, "Trainer:") %>
    <%= select_tag :entrenador, 
       options_from_collection_for_select(@entrenadores, "id", "name"), 
       prompt: "Select the trainer", class: 'form-control' %>
    <b>Days:</b>
    <div class="well">
      <% @dias.each_with_index do |day, index| %>
        <%= label_tag day, day, class: "checkbox-inline nopadding"; %>
        <%= check_box_tag 'dias[]', index, checked = false, class: 
         "nopadding" %>  |
      <% end %>
    </div>
    <%= label_tag(:inicio, "Starting Date:") %>
    <%= date_field_tag :inicio, class: 'form-control' %>
    <%= label_tag(:final, "Ending Date:") %>
    <%= date_field_tag :final, class: 'form-control' %>
    <%= submit_tag "Create events", class: "btn btn-default" %>
  <% end %>
</div>

它工作正常并返回params:

{"utf8"=>"✓",
 "authenticity_token"=>"10BsOFEsCvO...==",
 "entrenador"=>"2",
 "dias"=>["2", "4"],    # Being Tuesday and Thursday
 "inicio"=>"2017-06-28",
 "final"=>"2017-06-30",
 "commit"=>"Create events"}

生成表单的控制器操作是:eventos#forma_prog

# GET /eventos/forma_prog
def forma_prog
  @entrenadores = User.all
  @dias = %w[Dom Lun Mar Mie Jue Vie Sab]
  @evento = Evento.new
end

应该创建事件的控制器操作是eventos#programa:

# POST /eventos/programa
def programa
  entrenador = User.find(params[:entrenador])
  inicio = Date.parse(params[:inicio])
  final = Date.parse(params[:final])
  dias = params[:dias].map! {|ele| ele.to_i }
  @tipoEvento = "Entrenamiento"

  entrenador.equipos.each do |equipo|
    for @fecha in (inicio..final) do
      if dias.include?(@fecha.wday)
        @equipo_id = equipo.id
        @evento = Evento.new(evento_params)
        if !@evento.save
          flash[:error] = "No ha sido posible crear los eventos."
          redirect_to root_path
        end
      end
    end
  end
end

当我点击提交按钮时,我收到错误消息 param缺失或值为空:evento 且应用控制台指向eventos#evento_params:

# Never trust big bad internet, always use strong params
def evento_params
  params.require(:evento).permit(:fecha, :tipoEvento, :equipo_id, :comment, :registrado, :asistencias_attributes => [:evento_id, :player_id, :tipo, :comment])
end

我可以看到 params.require(:evento)部分是问题,我想它与'form_tag'有关,我选择了'form_for @evento'但是我这样做是因为我认为表单与模型的@evento对象没有完全相关,请在这里帮助我......

1 个答案:

答案 0 :(得分:1)

你是对的,第一个问题form_tag没有像你期望的那样将一个键中的所有evento值组合在一起。

这可以使用form_for解决,但是,如果您想保留form_tag,只需使用evento[attribute]重命名输入。

其中attribute是参数/字段的名称(例如输入evento[fecha]的{​​{1}})。

修正上述内容后,您提到的错误将会消失,但会引发另一个错误,因为fecha中未发送创建Evento所需的任何属性。

所以,第二个问题form没有发送所有参数;您可以在form方法中找到所需的参数:

evento_params

这意味着def evento_params params.require(:evento).permit(:fecha, :tipoEvento, :equipo_id, :comment, :registrado, :asistencias_attributes => [:evento_id, :player_id, :tipo, :comment]) end 期望具有此结构的 Parameters 哈希:

evento_params

要解决此问题,您需要发送所有缺少的参数,或者调整{ "utf8"=>"✓", "authenticity_token"=>"...", "evento"=>{ "fecha"=>"...", "tipoEvento"=>"...", "equipo_id"=>"...", "comment"=>"...", "registrado"=>"...", "asistencias_attributes"=>[ { evento_id=>"...", player_id=>"...", tipo=>"...", comment=> "..." } ], "commit"=>"Create events" } 方法以仅使用evento_params发送的参数。