我有一些複選框及其名稱映射到我的activerecord模型中的一列。問題是,當選擇了checboxes時,它們出現在Sinatra的params數組中,它工作正常。但是當它們被取消選擇時,參數永遠不會包含:checkbox => false。它只包含:checkbox => true。因此,用戶可以從取消選擇到選擇,但從不相反,因爲params hash:checkbox => false從不傳遞。如果未選中,如何更新複選框?
我覺得我在這裏錯過了一些基本的東西。請幫忙。 感謝
我有一些複選框及其名稱映射到我的activerecord模型中的一列。問題是,當選擇了checboxes時,它們出現在Sinatra的params數組中,它工作正常。但是當它們被取消選擇時,參數永遠不會包含:checkbox => false。它只包含:checkbox => true。因此,用戶可以從取消選擇到選擇,但從不相反,因爲params hash:checkbox => false從不傳遞。如果未選中,如何更新複選框?
我覺得我在這裏錯過了一些基本的東西。請幫忙。 感謝
A control in a HTML form only gets submitted to the server if it is 「successful’。對於複選框,這意味着它被檢查。未經檢查的複選框不會被提交。這意味着在Sinatra中,params[:the_checkbox]
的值是HTML中指定的複選框的值(如果您未指定值,則這將是默認值,即字符串'on'
)(如果選中),或者將爲nil
,因爲沒有提交任何內容。
顯而易見的解決方案是明確檢查nil
,再假設該複選框在這種情況下,未選中:
checkbox_value = params[:the_checkbox].nil? ? false : true
另一種選擇是使用的事實name/value pairs of the form data are sent to the server in the order that they appear in the document,而當西納特拉在解析數據時會看到一個重複的名稱,它會覆蓋較早的值。這意味着你可以做這樣的事情在HTML:
<input type='hidden' name='the_checkbox' value='false' />
<input type='checkbox' name='the_checkbox' value='true' />
現在,如果沒有選中該複選框,將不會被提交,但隱藏的輸入會,如果被選中它會被提交,但會在後出現與隱藏輸入同名。結果是params[:the_checkbox]
將是字符串'true'
(如果已被選中)以及字符串'false'
(如果沒有)。 (請注意,您可能仍然需要將字符串轉換爲布爾值,具體取決於您對提交的數據所做的操作)。
你可以做這樣的事情:
post '/your-route' do
params[:checkbox] ||= false
# now do whatever you want with params[:checkbox]
end
這樣做是分配給false
除非params[:checkbox]
它已經定義並設置爲true
。
轉到隱藏字段。 http://stackoverflow.com/questions/476426/submit-an-html-form-with-empty-checkboxes?lq=1 – oldergod