我希望从特定培训师表单中输入的选定日期的日期范围生成多个预定事件,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对象没有完全相关,请在这里帮助我......
答案 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
发送的参数。