0
私はチェックボックス付きのフォームを持っています。ユーザー(教室の教師)は、予備テストとみなしたい目標をクリックします。未チェックボックスの属性を更新する
コントローラは、チェックされたレコードごとに:pretest値を "1"に設定します。
コントローラでは、チェックされていないボックスがチェックされていない各レコードについてpretest値を "0"に設定する必要があります。
これまでは、EVERYTHINGをゼロに設定してから、チェックボックスを更新しています。しかし、私は、これを行うより多くの道があると考えています。
コントローラー:
def update_pretests
@seminar = Seminar.find(params[:seminar_id])
@seminar.objective_seminars.update_all(:pretest => 0)
ObjectiveSeminar.where(:id => params[:pretest_on]).update_all(:pretest => 1)
end
ビュー:
<%= form_tag update_pretests_objective_seminars_path do %>
<input type="hidden" name="seminar_id" value="<%= @seminar.id %>">
<table>
<% @os.each do |os| %>
<% obj = os.objective %>
<tr>
<td><%= check_box_tag 'pretest_on[]', os.id, os.pretest > 0, {:id => "pretest_on_#{obj.id}"} %></td>
<td><%= obj.name %></td>
</tr>
<% end %>
</table>
<%= submit_tag "Update Pretests" %>
<% end %>
任意の洞察力のために事前にありがとうございます!
RailsやSQLのどちらかの方が良い方法はありませんが、他のスレッド/プロセス/サーバが中間状態を認識しないように、これらの2つの更新をトランザクションの下に置いてください。少なくとも外部からは、それらをすべて直接設定したように見えます。 –
フォームはどのように設定されていますか? HTMLを管理している場合は、ここで[check_box'のドキュメントを参照することをお勧めします(http://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormHelper.html#method-i -check_box)...彼らは、チェックボックスと共に提出される '0'の値を持つ隠れた入力を作成し、次に '1'が存在するならば、レールパラメータパージングは '0'を取り除くと説明しています。次に、各チェックボックスのフォームに「0」または「1」のいずれかを送信して、通常どおりにそれぞれを更新します。そのヘルパーを使用したくない場合は、そのアイデアは –
です。ビューを含めるように質問が更新されました。目的とセミナーの間の結合表であるすべてのobjective_seminarsを反復処理します。返されるパラメータには、チェックされた結合のIDのみが含まれているように見えます。おそらく、フォームが多くのレコードの配列を送信しているため、パラメータにゼロが表示されません。しかし、私は、慣習にぴったり合う方法があれば、フォームをリファクタリングするつもりです。 –