2012-12-03 59 views
1

我有一些複選框及其名稱映射到我的activerecord模型中的一列。問題是,當選擇了checboxes時,它們出現在Sinatra的params數組中,它工作正常。但是當它們被取消選擇時,參數永遠不會包含:checkbox => false。它只包含:checkbox => true。因此,用戶可以從取消選擇到選擇,但從不相反,因爲params hash:checkbox => false從不傳遞。如果未選中,如何更新複選框?

我覺得我在這裏錯過了一些基本的東西。請幫忙。 感謝

+0

轉到隱藏字段。 http://stackoverflow.com/questions/476426/submit-an-html-form-with-empty-checkboxes?lq=1 – oldergod

回答

4

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'(如果沒有)。 (請注意,您可能仍然需要將字符串轉換爲布爾值,具體取決於您對提交的數據所做的操作)。

0

你可以做這樣的事情:

post '/your-route' do 
    params[:checkbox] ||= false 

    # now do whatever you want with params[:checkbox] 
end 

這樣做是分配給false除非params[:checkbox]它已經定義並設置爲true

相關問題