4

解決済みというブール列を持つディスカッションという単純なモデルがあります。

私のフォームには、次のコードがあります

<%= form_for(@discussion) do |d| %>
...
<%= d.check_box :resolved %>
<% end %>

そして、コントローラーには次のものがあります。

def update
  @discussion = Discussion.find(params[:id])
  if @discussion.update_attributes(params[:discussion])
    etc...
  end
end

フォームを送信すると、パラメーターがサーバーに送信されていることがわかります...

Parameters: {"utf8"=>"✓", "authenticity_token"=>"AsGsRHwiVva/+kTrBs0IjLeZwj1ZmXBuKZr9Pg/N6Xk=", "discussion"=>{"shortdesc"=>"Talk about something.", "content"=>"Try to update check box.", "resolved"=>"1"}, "commit"=>"Update Discussion", "id"=>"1"}

ただし、クエリには、そのフィールドの更新に関するものは何も含まれていません。

AREL (14.9ms)  UPDATE "discussions" SET "content" = 'Try to update check box.', "updated_at" = '2011-07-18 17:53:50.783176' WHERE "discussions"."id" = 1

私が見逃しているものについて何か考えはありますか?

4

4 に答える 4

18

これが発生する理由は 4 つあります。

  1. resolvedデータベースですでに true に設定されています。
  2. モデルでメソッドを定義しresolved=ましたが、属性が設定されなくなりました。
  3. あなたが持っていattr_protected :resolvedます。
  4. リストにはありますがattr_accessible、ありません:resolved
于 2011-07-18T18:00:46.353 に答える
1

ブール列にデフォルトがありますか? デフォルトがtrueの場合、レールはそれを属性のセットに追加することを気にしないかもしれません。

または、その列に attr_protected を設定しましたか? その場合、レールは update_attributes を使用してそのフィールドを属性に追加しません。手動で行う必要があります。

于 2011-07-18T18:00:35.393 に答える
1

全て、

私は最近 Rails を始めて、他の誰かのコードを引き継いでいたのですが、ここで取り上げられていない別のシナリオを見つけて、それが私を悩ませていました。

このリンクが指すスタイルを使用する場合、パラメーターは別の方法で形成されます。「_params」メソッドを更新して、許可リストに追加する必要がありました。

http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

于 2014-04-13T17:34:23.903 に答える
0

要素が送信されたことを確認しますか? つまり、要素がチェックされていないフォーム要素は送信されないため、デフォルトの false の非表示のチェックボックスを配置する必要があります。

于 2011-07-18T18:05:14.930 に答える