2017-08-05 7 views
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 %> 

任意の洞察力のために事前にありがとうございます!

+1

RailsやSQLのどちらかの方が良い方法はありませんが、他のスレッド/プロセス/サーバが中間状態を認識しないように、これらの2つの更新をトランザクションの下に置いてください。少なくとも外部からは、それらをすべて直接設定したように見えます。 –

+2

フォームはどのように設定されていますか? HTMLを管理している場合は、ここで[check_box'のドキュメントを参照することをお勧めします(http://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormHelper.html#method-i -check_box)...彼らは、チェックボックスと共に提出される '0'の値を持つ隠れた入力を作成し、次に '1'が存在するならば、レールパラメータパージングは​​ '0'を取り除くと説明しています。次に、各チェックボックスのフォームに「0」または「1」のいずれかを送信して、通常どおりにそれぞれを更新します。そのヘルパーを使用したくない場合は、そのアイデアは –

+0

です。ビューを含めるように質問が更新されました。目的とセミナーの間の結合表であるすべてのobjective_seminarsを反復処理します。返されるパラメータには、チェックされた結合のIDのみが含まれているように見えます。おそらく、フォームが多くのレコードの配列を送信しているため、パラメータにゼロが表示されません。しかし、私は、慣習にぴったり合う方法があれば、フォームをリファクタリングするつもりです。 –

答えて

0

私が得た回答では、私の特定のセットアップでこれを行うためのより多くの方法があるようには見えません。しかし、私は少なくとも、Fire Lancerの中間状態がないことを保証するという提案をしました。今私のコントローラーは次のようになります:

def update_pretests 
     @seminar = Seminar.find(params[:seminar_id]) 
     @seminar.objective_seminars.where.not(:id => params[:pretest_on]).update_all(:pretest => 0) 
     @seminar.objective_seminars.where(:id => params[:pretest_on]).update_all(:pretest => 1) 
     redirect_to priorities_seminar_path(@seminar) 
    end 

他の誰かがこの質問の洞察を持っているなら、私はまだ興味があります。

関連する問題