web-dev-qa-db-ja.com

Rails:ボックスがチェックされているかどうかにかかわらず、form_forチェックボックスがtrueまたはfalseに設定されています

2つのブール属性send_emailsend_textを持つusersというモデルがあります。 Userモデルを編集するフォームがあり、ボックスがオン/オフされているかどうかに応じて、それらの属性をtrue/falseに設定する必要があります。こちらが私のフォームです

<%= form_for(@user) do |f| %>
    <div class="field">
        <%= f.label :email %> <br />
        <%= f.text_area :email %> <br />
    </div>
    <div class="field">
        <%= f.label :cell %> <br />
        <%= f.text_area :cell %> <br />
    </div>
    <div class="field">
        <%= f.label "Get Email" %> <br />
        <%= f.check_box :send_email, {}, true, false %> <br />
    </div>
    <div class="field">
        <%= f.label "Get Text" %> <br />
        <%= f.check_box :send_text, {}, true, false %> <br />
    </div>
    <div class="actions">
  <%= f.submit "Submit", class: "button small radius" %>
  <%= link_to "go back", @user, class: "button small radius secondary" %>
</div>
<% end %>

そして、これはuser_controllerupdateアクションです

def update
    @user = User.find(params[:id])
    @user.update_attributes(params[:user])
    redirect_to @user
end

フォームと更新は完全に機能するように見えますが、send_emailまたはsend_textボックスをオンにしてこのフォームを送信しても、ユーザーモデル(send_email、send_text)の属性はfalseに変更されません。

24
user2158382

フォームがオブジェクトを操作しているときにRailsがこれを行います。タグから余分なものはすべてそのままにしておきます。

<div class="field">
    <%= f.label "Get Email" %> <br />
    <%= f.check_box :send_email %> <br />
</div>

そして、すべてが期待どおりに動作し始めるはずです。属性がtrueの場合、チェックボックスがオンになり、逆の場合は、フォームを送信するときにチェックされた状態が属性に影響します。コードの残りは問題ありません。

49
Matt

フォームおよびデータベースの更新に関する詳細情報

確かに、最後の答えは正しいです。form_for構文を使用するだけで十分です。Railsは、unchecked:false/checked:trueの関連付けを行います。

<div class="field">
    <%= f.label "Get Email" %> <br />
    <%= f.check_box :send_email %> <br />
</div>

その構文でも同じ問題がありました。事実は、サーバーのコンソールから返されたUnpermitted parameter: checkbox_valueparamsに入れるために必須/許可されたパラメーターを更新することを忘れないでください!そして私の場合:

# ***_controller.rb
      private
        def operator_params
          params.require(:operator).permit(:name, :website, :checkbox_value, :global)
        end
3
tomsihap

同じ問題がありました。

<% @batches.each do |batch| %>
  <div class="name_list<%=cycle('odd', 'even')%>"><li>
    <label><%= check_box_tag "send_sms[batch_ids][]",  batch.id,false,:class=>'right' %>
   <div class="att_list_names"> <%= batch.full_name %></div> </label>
   </li>  </div>
  <% end %>
0
Dhanshree