简单形式不将参数传递给控制器 RAILS

Simple form not passing parameter to controller RAILS

提问人:Rodrigo Ladrón de Guevara 提问时间:10/8/2023 最后编辑:Rodrigo Ladrón de Guevara 更新时间:10/24/2023 访问量:52

问:

我有一个简单的表单,其中包含一些javascript,根据用户的选择显示一些输入字段或其他字段。我得到的奇怪行为是,无论我放在上面(例如),最后一个 f.input() 都不会传递给控制器。如果我更改了 div 的位置,那么现在另一个不会传递。divdiv id="id1":motivof.input :motivo

<%= simple_form_for(@vacacion, validate: true, html: { class: "form-horizontal", role: "form" }) do |f| %>
  <%= f.error_notification %>
  <%= display_base_errors @vacacion %>

  <%= f.input :tipo, label: 'Tipo', as: :select, collection: [["Registrar días de vacaciones utilizados", "tomadas"], ["Abonar días de vacaciones", "abonadas"]], required: true %>

  <div id="id1" style="display:none">
    <%= f.input :desde, label: 'Fecha inicio vacaciones', as: :datepicker, input_html: { value: @vacacion.desde.present? ? l(@vacacion.desde, format: :slash) : nil } %>
    <%= f.input :hasta, label: 'Fecha fin vacaciones', as: :datepicker, input_html: { value: @vacacion.hasta.present? ? l(@vacacion.hasta, format: :slash) : nil } %>
    <%= f.input :dias_tomados, label: 'Días de vacaciones utilizados', input_html: { min: 0 }, hint: '<div id="dias_habiles_div"></div>'.html_safe %>
    <%= f.input :motivo, input_html: { id: 'motivo_tomadas'} ,label: 'Motivo de los días tomados' %>
  </div>

  <div id="id2" style="display:none">
    <%= f.input :dias_abonados, label: 'Días de vacaciones a abonar', input_html: { min: 0 } %>
    <%= f.input :motivo, input_html: { id: 'motivo_abonadas'},label: 'Motivo de los días abonados' %>
  </div>

...

$(document).ready(function(){
    $("#vacacion_tipo").change(function(){
      if(this.value == "tomadas"){
        $("#campos_vacaciones_abonadas").hide("slow");
        $("#campos_vacaciones_tomadas").show("slow");
      }

      if(this.value == "abonadas"){
        $("#campos_vacaciones_abonadas").show("slow");
        $("#campos_vacaciones_tomadas").show("slow");
      }
    });

我尝试在每种情况下为输入添加 id,但这没有帮助。 当我查看控制台检查参数时,所有其他参数都传递正常,但是使用“motivo”,我得到"motivo"=>""

有什么建议吗?谢谢

javascript html ruby-on-rails 简单形式

评论

0赞 Beartech 10/8/2023
您是否在多个浏览器中测试过?HTML 4 中的更改使 display:none 仍然提交表单,但当时并非每个浏览器都可以使用。您还可以编辑您的问题以添加为每个状态生成的 HTML 吗?
0赞 chrwahl 10/8/2023
我不知道简单形式,但通过阅读您的代码,simple-fom 如何知道形式何时结束?如果你在浏览器开发工具元素检查器中查看 -- 你在哪里找到最后一个输入元素,是否包含最后一个输入元素?这归结为:生成的 HTML 表单是否符合预期?</form>
0赞 Rodrigo Ladrón de Guevara 10/8/2023
@Beartech 是的,在 chrome 和 Safari 中进行了测试。相同的结果。除了第一个 div 之外,生成的 HTML 完全相同,它还显示一个 data-parsley-id,而另一个则没有
0赞 max 10/8/2023
在 中出现语法错误。您还应该注意,当涉及 Turbo(或任何其他 AJAX 框架)时,将事件处理程序直接附加到元素是一种非常有缺陷的方法。它只是导致了经典的“但是哇!当我重新加载页面时,我的代码可以工作!您应该改用委托事件处理程序,这是 Stimulus 为您所做的f.input :motivo, input_ html:
1赞 engineersmnky 10/10/2023
您有 2 个同名的输入。在这种情况下,最后一个获胜(覆盖第一个)。您需要为每个元素使用不同的名称或在提交之前操作该值

答:

0赞 jeffdill2 10/24/2023 #1

这实际上不是 Rails 或 SimpleForm 的问题。这就是表单的工作方式。

看看生成的 HTML,你会看到你有两个名为“motivo”的输入。name 属性是驱动表单提交中传递的参数的因素。由于不能有两个同名的参数,它只是提交它遇到的最后一个参数,有效地覆盖第一个参数。