如何使Rails 5.2表单远程提交?

时间:2018-10-17 14:52:56

标签: ruby-on-rails

在我看来,使用Slim:

= form_with url: update_pn_price_path(@price)
  .form-group
    = label_tag :part_number
    = text_field_tag :part_number, @price.part_number, required: true

  .form-group
    => submit_tag t(:save), class: 'btn btn-primary btn-sm'
    = link_to 'Cancel', '', class: 'btn btn-link btn-sm', data: { cancel_in_place: true }

这始终使用标准提交而不是远程提交。日志显示:

Processing by PricesController#update_pn as HTML

我在做什么错?为什么不使用JS提交?

2 个答案:

答案 0 :(得分:5)

我很惊讶地看到您的观点被编译了。我可以发现一些问题。

  1. 您开始缩进内容,就好像它是形式一样。但是,您没有打开表单标签或没有为 form_with 方法提供块。

    = form_with url: update_pn_price_path(@price)
      .form-group
    

    至少应更改为:

    = form_with url: update_pn_price_path(@price) do
      .form-group
    

    由于将变量提供给块,因此首选方法是将其捕获到变量中(以下代码中的form)。如果您不打算使用它,则仍应将其捕获在一个带下划线的变量中,以表明它在那里但未被使用(_form)。

    = form_with url: update_pn_price_path(@price) do |form|
      .form-group
    
  2. 由于您使用的是表单生成器,因此创建元素的首选方法是通过表单生成器界面。由于您不是通过表单构建器来创建Submit标签的,这可能是另一个原因,即提交不是远程完成的。

    我至少会替换:

    => submit_tag t(:save), class: 'btn btn-primary btn-sm'
    

    使用:

    = form.submit t('save'), class: 'btn btn-primary btn-sm'
    

    但最好将整个表单更新为使用表单生成器。结果应如下所示:

    = form_with model: @price, url: update_pn_price_path(@price) do |form|
      .form-group
        = form.label :part_number
        = form.text_field :part_number, required: true
    
      .form-group
        = form.submit t('save'), class: 'btn btn-primary btn-sm'
        = link_to 'Cancel', '', class: 'btn btn-link btn-sm', data: {cancel_in_place: true}
    

有关其他表单生成器方法的更多信息,请参见FormBuilderFormHelper文档。

答案 1 :(得分:2)

这是解决问题的方法。新秀错误,但在此处发布以防其他人碰到它。

我上面显示的表单在另一个表单内。您可以提交这样的“内部”表格,但不能远程提交。该表单是通过AJAX调用插入的,因此我将其更改为插入到HTML正文的末尾,然后使用CSS进行定位。这使它超出了包含表单的范围,并使事情按预期进行。