远程表单提交禁用的输入
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
,但我也需要远程表单以上是关于远程表单提交禁用的输入的主要内容,如果未能解决你的问题,请参考以下文章