1

いくつかのチェックボックスがあり、それらの名前はアクティブレコードモデルの列にマップされています。問題は、チェックボックスが選択されると、それらが Sinatra の params 配列に表示され、正常に動作することです。しかし、それらが選択されていない場合、params に :checkbox => false が含まれることはありません。:checkbox => true のみが含まれています。:checkbox => false の params ハッシュが渡されることはないため、ユーザーは選択解除から選択解除に移行できますが、その逆はできません。

ここで根本的な何かが欠けているように感じます。助けてください。ありがとう

4

2 に答える 2

4

HTMLフォームのコントロールは、「成功」した場合にのみサーバーに送信されます</a>。チェックボックスの場合、これはチェックされていることを意味します。チェックされていないチェックボックスは送信されません。つまり、Sinatraでは、params[:the_checkbox]の値は、チェックされている場合はHTMLで指定されたチェックボックスの値(値を指定しない場合、これは文字列であるデフォルトになります'on')であるかnil、何も持たないためになります。提出されました。

明らかな解決策は、を明示的にチェックしnil、その場合はチェックボックスがオフになっていると想定することです。

checkbox_value = params[:the_checkbox].nil? ? false : true

もう1つのオプションは、フォームデータの名前と値のペアがドキュメントに表示される順序でサーバーに送信され、 Sinatraがデータの解析時に繰り返しの名前を検出すると、前の値と後の値。これは、HTMLで次のようなことができることを意味します。

<input type='hidden' name='the_checkbox' value='false' />
<input type='checkbox' name='the_checkbox' value='true' />

チェックボックスがチェックされていない場合は送信されませんが、非表示の入力は送信されます。チェックされている場合は送信されますが、同じ名前の非表示の入力の後に表示されます。結果は、チェックされている場合params[:the_checkbox]は文字列'true'になり、チェックされ'false'ていない場合は文字列になります。(送信されたデータで何をしているのかによっては、文字列をブール値に変換する必要がある場合があることに注意してください)。

于 2012-12-03T21:18:37.337 に答える
0

次のようなことができます:

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

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

これが行うことは、既に定義されて に設定されていない限り、falseへの割り当てです。params[:checkbox]true

于 2012-12-03T19:47:51.533 に答える