###実現したいこと
以下画面の承諾、拒否のフラグをクリックで選択し、『申し込みのフラグを更新する』を押すと、フラグが一括更新される機能を実装したのですが、『申し込みのフラグを更新する』をクリックしても、controller記載のflash.notice = 'レッスン申込者のフラグを更新しました。'
は表示されるのですが、フラグは更新されません。
実装にあたりRails : フォームオブジェクト
やJavaScript
を利用しています。
誤りをご指摘頂きたく宜しくお願い致します。
申し込みのためのフォームオブジェクト
ruby
1class User::EntriesForm 2 include ActiveModel::Model 3 4 attr_accessor :product, :approved, :not_approved, :canceled, :not_canceled 5 6 def initialize(product) 7 @product = product 8 end 9 10 def assign_attributes(params) 11 @approved = params[:approved] 12 @not_approved = params[:not_approved] 13 @canceled = params[:canceled] 14 @not_canceled = params[:not_canceled] 15 end 16 17 def save 18 approved_entry_ids = @approved.split(':').map(&:to_i) 19 not_approved_entry_ids = @not_approved.split(':').map(&:to_i) 20 canceled_entry_ids = @canceled.split(':').map(&:to_i) 21 not_canceled_entry_ids = @not_canceled.split(':').map(&:to_i) 22 23 ActiveRecord::Base.transaction do 24 @product.entries.where(id: approved_entry_ids). 25 update_all(approved: true) 26 @product.entries.where(id: not_approved_entry_ids). 27 update_all(approved: false) 28 @product.entries.where(id: canceled_entry_ids). 29 update_all(canceled: true) 30 @product.entries.where(id: not_canceled_entry_ids). 31 update_all(canceled: false) 32 end 33 end 34end
テンプレート
html
1<table class="table"> 2 <thead> 3 <tr> 4 <th>#</th> 5 <th>ユーザーネーム</th> 6 <th>承諾</th> 7 <th>拒否</th> 8 </tr> 9 </thead> 10 <tbody> 11 <tr> 12 <th scope="row">1</th> 13 <td>erika</td> 14 <td> 15 <input type='checkbox', class='approved', data-entry-id='1'> 16 </td> 17 <td> 18 <input type='checkbox', class='canceled', data-entry-id='1'> 19 </td> 20 </tr> 21 </tbody> 22 <tbody> 23 <tr> 24 <th scope="row">2</th> 25 <td>chimaki</td> 26 <td> 27 <input type='checkbox', class='approved', data-entry-id='2'> 28 </td> 29 <td> 30 <input type='checkbox', class='canceled', data-entry-id='2'> 31 </td> 32 </tr> 33 </tbody> 34 <tbody> 35 <tr> 36 <th scope="row">3</th> 37 <td>sotako</td> 38 <td> 39 <input type='checkbox', class='approved', data-entry-id='3'> 40 </td> 41 <td> 42 <input type='checkbox', class='canceled', data-entry-id='3'> 43 </td> 44 </tr> 45 </tbody> 46 <tbody> 47 <tr> 48 <th scope="row">4</th> 49 <td>ruffy</td> 50 <td> 51 <input type='checkbox', class='approved', data-entry-id='4'> 52 </td> 53 <td> 54 <input type='checkbox', class='canceled', data-entry-id='4'> 55 </td> 56 </tr> 57 </tbody> 58</table> 59<div class = 'button-wrapper'> 60 <form class="new_form" id="new_form" action="/user/products/1/entries" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><input type="hidden" name="_method" value="patch" /><input type="hidden" name="authenticity_token" value="se6s0O8G5KRrknZrFG79P8IIkOH7BrU79SYHeLSkcvh2VGyiLCpMNuzDl8GfBTLi6RR+egO/yWfElgG15xU37A==" /> 61 <input type="hidden" name="form[approved]" id="form_approved" /> 62 <input type="hidden" name="form[not_approved]" id="form_not_approved" /> 63 <input type="hidden" name="form[canceled]" id="form_canceled" /> 64 <input type="hidden" name="form[not_canceled]" id="form_not_canceled" /> 65 <button name="button" type="button" id="update-entries-button" class="btn btn-outline-primary">申し込みのフラグを更新する</button> 66</form></div> 67 68#上記部分のruby記述 69<div class = 'button-wrapper'> 70 <%= form_for User::EntriesForm.new(product: @product), as: 'form', url: [:entries, :user, @product], html: { method: :patch} do |f| %> 71 <%= f.hidden_field :approved %> 72 <%= f.hidden_field :not_approved %> 73 <%= f.hidden_field :canceled %> 74 <%= f.hidden_field :not_canceled %> 75 <%= button_tag '申し込みのフラグを更新する', type:'button', id:'update-entries-button', class: "btn btn-outline-primary"%> 76 <% end %> 77</div>
ルーティング
ruby
1resources :products do 2 patch :entries, on: :member 3end
申し込みのフラグを更新する
ボタンを押された時の処理を記述したJavaScript
JavaScript
1$(function() { 2 return $('div.button-wrapper').on('click', 'button#update-entries-button', function() { 3 var approved, canceled, not_approved, not_canceled; 4 approved = []; 5 not_approved = []; 6 canceled = []; 7 not_canceled = []; 8 $('table.entries input.approved').each(function() { 9 if ($(this).prop('checked')) { 10 return approved.push($(this).data('entry-id')); 11 } else { 12 return not_approved.push($(this).data('entry-id')); 13 } 14 }); 15 $('#form_approved').val(approved.join(':')); 16 $('#form_not_approved').val(not_approved.join(':')); 17 $('table.entries input.canceled').each(function() { 18 if ($(this).prop('checked')) { 19 return canceled.push($(this).data('entry-id')); 20 } else { 21 return not_canceled.push($(this).data('entry-id')); 22 } 23 }); 24 $('#form_canceled').val(canceled.join(':')); 25 $('#form_not_canceled').val(not_canceled.join(':')); 26 return $('div.button-wrapper form').submit(); 27 }); 28});
コントローラー
ruby
1def entries 2 entries_form = User::EntriesForm.new(Product.find(params[:id])) 3 entries_form.assign_attributes(params[:form]) 4 entries_form.save 5 flash.notice = 'レッスン申込者のフラグを更新しました。' 6 redirect_to [current_user, :user_product] 7 end