這發生在我的Rails應用程序中,但我不確定這是Rails問題還是我誤解了多部分表單應該工作。以多部分形式提交空字符串作爲空字符串,不爲空
這裏的(像)我的表格:
<%= form_for @user do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
User#name
有存在驗證。如果我訪問users/1/edit
,請清空'name'文本字段的值,然後單擊submit,由於存在驗證失敗,因此不會更新任何內容。到現在爲止還挺好。
但現在我已經添加了一個avatar
屬性我的用戶(使用回形針寶石用於文件存儲),所以我更新相應的形式:
<%= form_for @user do |f| %>
<%= f.text_field :name %>
<%= f.file_field :avatar %>
<%= f.submit %>
<% end %>
現在,如果我去編輯用戶併爲name
提交空白值,驗證不會失敗。 User#name
保持以前的值,但更新仍然看起來成功(即我沒有收到有關驗證失敗的錯誤消息,並且數據庫中的updated_at
時間戳得到更新。)
仔細觀察,似乎是我在表單中包含file_field
,它會在提交空白文本字段時更改表單的行爲(可能是由於form_for
現在輸出的格式爲enctype=-"multipart/form-data"
)。
當file_field
不目前,提交空白name
發送這些PARAMS到服務器:
{ "id" => 1, "user" => { "name: "" }
導致控制器,這當然無法更新像User.find(1).update_attributes(name: "")
因爲Rails認爲我們試圖將'name'更新爲空字符串,並且驗證失敗。
當爲目前,這種被提交:
{ "id" => 1, "user" => { }
(加上約化身文件額外的信息)
的「姓名」鍵不存在可言,所以控制器運行User.find(1).update_attributes()
這當然會通過,因爲沒有任何更新可能會導致驗證失敗。
這是一個錯誤或功能?爲什麼要將enctype改爲multipart(假設這是問題的根源)會改變空白文本字段的行爲方式? (我已經在Chrome和FF,fwiw中對此進行了測試)。如果這確實是預期的行爲,我如何確保空白文本字段得到正確提交,而無需在每個文本字段中添加一堆繁瑣的樣板文件?
(如果有問題,我使用:Ruby 2.3.0,Rails 5.0.0.beta3,Paperclip 5.0.0。β1,我已經在Chrome 49和Firefox 45)
奇怪的是,我無法重現你描述的行爲。在我的情況下(Rails 4.2雖然),無論編碼類型是什麼形式,空名都是_always_作爲空字符串發送:'「name」=>「」''。也許你可以在Rails 4上嘗試相同的代碼,以便可能發現Rails 5的行爲變化(甚至是bug)? – BoraMa
另請參閱我認爲需要的[my edit](http://stackoverflow.com/posts/36501726/revisions),以便如果我誤解了您,問題實際上是有意義的,並將其還原。 – BoraMa
是的,你的編輯是正確的。感謝您捕捉我的錯誤。 – GMA