Rails 4 Carrierwave,simple_form 使用隐藏字段时不调用 ActionDispatch

Rails 4 Carrierwave, simple_form does not invoke ActionDispatch when hidden field used

目标:用户选择要上传的头像图像并单击 "Upload" 或单击 "Reset" 删除自定义头像图像并使用默认值。 (除了 "picture" 字段隐藏在非工作表单中之外,基础表单、控制器、操作、模型是相同的。)

1- 当用户选择图片时,表单提交起作用,carrierwave 上传图片。这是 工作版本 提交操作哈希:

<%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %>
Hash {"utf8"=>"✓", "_method"=>"patch", 
"authenticity_token"=>"xxxxx", 
"avatar"=>{"picture"=>#<ActionDispatch::Http::UploadedFile:0x2e77fd8 
@tempfile=#<File:C:/DOCUME~1/Val/LOCALS~1/Temp/RackMultipart20150305-2620-
1pq50l5.png>, @original_filename="admin_foodler_profile.png", 
@content_type="image/png", @headers="Content-Disposition: form-data;
 name=\"avatar[picture]\"; 
filename=\"admin_foodler_profile.png\"\r\nContent-Type: image/png\r\n">},
 "commit"=>"Upload photo", "controller"=>"avatars", "action"=>"update", 
"user_id"=>"8"} 

2- 当用户选择用默认头像替换头像时,这里是非工作 提交操作哈希。

    <%= f.hidden_field :picture, value:'default_profile.png' %>
Hash {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"xxxx", 
"avatar"=>{"picture"=>"default_profile.png"}, "commit"=>"Reset profile image",
 "controller"=>"avatars", "action"=>"update", "user_id"=>"8"}

当我在表单上使用默认图像名称的隐藏字段时,如您在散列中看到的那样。 "picture" 只是文件名,不是上传方式,但我不知道为什么。但结果是 ActionDispatch 没有被调用,默认图像 没有 上传,table 也没有更新。

我很确定答案很简单,隐藏属性 "picture" 字段是罪魁祸首。但我真的很想为用户提供简单地将他们的头像切换为默认 png 的能力。我认为这将是一个不费吹灰之力的改变。哈。非常感谢建议。

我认为,您不应该在应用的视图级别实现默认头像。

只需添加使用默认头像的复选框,这将在控制器级别删除文件,例如

@user.remove_avatar!

然后将 carrierwave 上传器配置为使用默认 url,例如: https://github.com/carrierwaveuploader/carrierwave#providing-a-default-url