远程表单提交禁用的输入

Posted

技术标签:

【中文标题】远程表单提交禁用的输入【英文标题】:Remote form submitting disabled inputs 【发布时间】:2018-05-02 14:41:59 【问题描述】:

在我的表单中,我想忽略表单提交时的一些输入字段。

我正在使用prop('disabled', true) 禁用这些字段,但它们仍在提交中

这只发生在远程表单上。会是什么?

我正在使用 turbolinks、rails 和 jquery

在这种情况下,将远程表单转换为常规的整页重新加载不是一种选择(模态和东西)

【问题讨论】:

【参考方案1】:

我遇到了完全相同的问题(需要根据用户交互禁用和启用某些字段)。通过使用分支5-1-stable 解决了它。 (之前是5.1.2

gem 'rails', git: 'https://github.com/rails/rails.git', branch: '5-1-stable' 

并更新您的 Rails gem

bundle update rails 

这个pull request 解决了这个问题。

注意:我正在开发的应用程序还没有投入生产,所以我现在使用stable 分支没有任何问题。如果您需要更保守的方法,可以尝试使用5.1.4,并检查上面链接中的提交是否包含在 repo 中。


如果您无法更改您的 rails gem 版本,另一种解决方案可能是删除或清空您未更改的输入的 name 属性 想提交。如果您检查拉取请求中的更改,您可以看到当前rails-ujs 正在从params 中删除那些没有name 属性的字段。因此,根据需要在字段中删除/设置此属性应该可以工作(尽管我没有尝试过)。也许是这样的:

// 'disable' the fields
$('your-inputs-selector[disabled="disabled"]').each(function(idx, elem) 
  var $elem = $(elem);
  $elem.data('input-name', $elem.attr('name'));
  $(elem).attr('name', '');
);  
// 're-enable' the fields
$('your-inputs-selector').each(function(idx, elem) 
  var $elem = $(elem)
  $elem.attr('name', $elem.data('input-name'));
);

希望对您有所帮助。

【讨论】:

【参考方案2】:

不要直接访问参数,你需要清理它们,这里是一个带有一些伪代码的示例,假设你只想要评论标题和正文(所有其他参数将被清除):

class CommentController < ApplicationController
  def create
    Comment.create(comment_params)
  end

  private

  def comment_params
    params.require(:comment).permit(:title, :body)
  end
end

【讨论】:

我完全同意你的观点,但问题出在 html 部分,而不是控制器。该表单将具有浏览器验证。如果选择了给定选项,则某些字段将被禁用且不会提交,但稍后用户可以更改选项,并且禁用的字段将启用且值不变。 @NicosKaralis 嗯,你不能设置输入的名称,这应该会阻止任何值被传递:***.com/questions/3008035/… 我不想丢失用户输入,真实的例子:一个用户可以是两种类型,每种类型需要不同的属性。该表单具有所有属性的字段,但隐藏了被忽略的字段。在服务器上我只测试@user.name = params[:company_name].present? ? params[:company_name] : params[:name],这适用于表单local: true,但我也需要远程表单

以上是关于远程表单提交禁用的输入的主要内容,如果未能解决你的问题,请参考以下文章

Safari:在输入时禁用表单提交? [复制]

禁用提交 btn 时,预填充的表单输入元素不接受第一个输入

提交表单将所有空输入及其关联的隐藏输入字段设置为禁用

在表单中提交禁用的输入无法获得价值

jquery禁用表单提交

仅在 _some 字段上通过 Enter 键禁用表单提交