Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 以多部分形式以空字符串(非null)形式提交空文本字段_Html_Ruby On Rails_Forms_Multipartform Data_Enctype - Fatal编程技术网

Html 以多部分形式以空字符串(非null)形式提交空文本字段

Html 以多部分形式以空字符串(非null)形式提交空文本字段,html,ruby-on-rails,forms,multipartform-data,enctype,Html,Ruby On Rails,Forms,Multipartform Data,Enctype,这是在我的Rails应用程序中发生的,但我不确定这是Rails的问题,还是我误解了多部分表单应该如何工作 这是我的表格: 现在,如果我去编辑用户并为name提交一个空白值,验证不会失败User#name将其保留为以前的值,但更新似乎仍然成功(即,我没有收到关于验证失败的错误消息,并且数据库中的updated_at时间戳得到更新。) 仔细观察,当我在表单中包含文件\u字段时,它似乎改变了表单在提交空白文本字段时的行为(可能是因为form\u for现在输出的表单带有enctype=-“多部分/表单

这是在我的Rails应用程序中发生的,但我不确定这是Rails的问题,还是我误解了多部分表单应该如何工作

这是我的表格:

现在,如果我去编辑用户并为
name
提交一个空白值,验证不会失败
User#name
将其保留为以前的值,但更新似乎仍然成功(即,我没有收到关于验证失败的错误消息,并且数据库中的
updated_at
时间戳得到更新。)

仔细观察,当我在表单中包含
文件\u字段时,它似乎改变了表单在提交空白文本字段时的行为(可能是因为
form\u for
现在输出的表单带有
enctype=-“多部分/表单数据”

文件\u字段
不存在时,提交一个空白的
名称
会将这些参数发送到服务器:

{“id”=>1,“user”=>{“name:”}

这会导致控制器中出现类似于
User.find(1).update\u attributes(name:)
的内容,当然更新失败,因为Rails看到我们试图将“name”更新为空字符串,验证失败

当它存在时,将提交:

{“id”=>1,“user”=>{}
(加上关于化身文件的额外信息)

“name”键根本不存在,因此控制器运行
User.find(1).update_attributes()
,当然会通过,因为没有任何更新会导致验证失败

这是一个bug还是一个特性?为什么将enctype更改为multipart(假设这是问题的根源)会改变空白文本字段的行为方式?(我在Chrome和FF、fwiw中都测试过这一点。)如果这确实是预期的行为,我如何确保空白文本字段正确提交,而不必在每个文本字段周围添加一堆冗长的样板文件


(如果有必要的话,我正在使用:Ruby 2.3.0、Rails 5.0.0.beta3、回形针5.0.0.beta1,我已经在Chrome 49和Firefox 45中进行了测试)

我想你可以这样做

updated_user = User.new(your_params) # The new attributes is set to a new object record    
target_user = User.find(params[:id]) # the user you want to update
target_user = updated_user

    if target_user.save?
    ..
    else
    .. 

通过此操作,将触发所有验证,活动记录将具有所有新属性,如果名称为空,它将捕获它

以下强参数方法将不会返回删除的:name参数,但它应防止表单模仿成功提交:

private
  def user_params
    params.require(:user).permit(:name, :avatar)
  end

这可以作为用户控制器下的私有方法插入。然后只需在更新方法中调用用户参数。

我也有同样的问题,将Rails更新到最新版本修复了它。

不起作用。前三行功能相当于
target\u user=user.new(您的参数)
将创建一个新用户,而不是更新现有用户-问题不在于
用户
无法捕获空白名称,问题在于
参数[:user][:name]
首先是空白的(键
:name
不存在)当它不应该是。现在我得到它,听起来奇怪,你尝试其他宝石般的CaveRew并发生同样的行为吗?奇怪的是,我无法重现你描述的行为。在我的例子中(Rails 4.2虽然),空白名称总是作为空字符串发送:<代码>”名称“=”。“
,无论表单编码类型如何。也许您可以在Rails 4上尝试相同的代码,以发现Rails 5的行为变化(甚至bug)?另外,请注意,我认为这是必要的,这样问题才有意义,如果我误解了你,请回复。是的,你的编辑是正确的。谢谢你抓住我的错误。这并没有回答我的问题。我已经有了一个强参数的
\u params
方法。是的,我使用的是Rails 5.0.0的一个beta版本。升级to RC似乎已经修复了它。
updated_user = User.new(your_params) # The new attributes is set to a new object record    
target_user = User.find(params[:id]) # the user you want to update
target_user = updated_user

    if target_user.save?
    ..
    else
    .. 
private
  def user_params
    params.require(:user).permit(:name, :avatar)
  end