チェックボックス付きのフォームがあります。フォームはモデルにマップされます。チェックボックスがクリックされておらず、このフィールドに何も送信されていない場合の問題を防ぐためのレールのドキュメントによると、レールはチェックボックスの直前に値が 0 の非表示フィールドを生成します。そのとおりです。
正しくないのは、チェックボックスをクリックしてフォームを送信した後、投稿リクエストで、最初に値 1 が送信され、次に値 0 (非表示フィールドから) が送信されることがわかります。この結果、チェックボックスは常に値 0。
パラメータ抽出はクエリ文字列で繰り返されるキーの最後の出現を取得すると述べている場合、ドキュメントは正しいですが、ポストリクエストの順序は正しくありません????
Rails 3.2.11を使用しています。
見る
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>
<p><%= f.label :name %><br />
<%= f.text_field :name %></p>
...
<div><%= f.label :send_dayplan_info %><br />
<%= f.check_box :send_dayplan_info %>
<div><%= f.submit "Update" %></div>
<% end %>
コントローラ ...
def update
...
if resource.update_with_password(params[resource_name])
....
end
end
概要
params[resource_name] をデバッグして評価すると、send_dayplan_info フィールドの値が常に 0 になります。
チェックボックスをクリックすると、firebug の投稿リクエストに次の値が含まれていることがわかります:
user[send_dayplan_info]=1
user[send_dayplan_info]=0
チェックボックスをクリックしないと、firebug の投稿リクエストに次の値が含まれていることがわかります:
user[send_dayplan_info]=0
以下は、クリックされたチェックボックスのフォームデータです
utf8:✓<br> _method:put
Authenticity_token:....
user[name]:....
user[send_dayplan_info]:1
user[send_dayplan_info]:0
生成された html のソース コードは次のとおり
です。
<div><label for="user_send_dayplan_info">Send dayplan info</label><br />
<input name="user[send_dayplan_info]" type="hidden" value="0" /><input id="user_send_dayplan_info" name="user[send_dayplan_info]" type="checkbox" value="1" />
<div><input name="commit" type="submit" value="Update" /></div>