前提・実現したいこと
日付に対してデータがある場合とない場合でdestroyリンクを動的に表示。
入力されている日付に紐づくデータをdestroyできるようにしたい。
仕様
日付に対してその日の血圧を記録するアプリを作っています。
モーダルフォーム(form_for)の日付フィールドにはデフォルトで今日の日付が入っていて、
今日のデータがあれば update, なければ create されます。
日付フィールドを変更すれば、変更された日付に紐づくデータ(Ajaxで取得)も編集・更新できます。
new, create, edit, update までは実装ができましたが、
destroyがうまく実装できません。
(画面イメージ)
デザインを入れ込んでいませんが、一番下の「delete」を押すとデータが消されるようにしたいです。
発生している問題・エラーメッセージ
-
日付フィールドを変更すると、Ajaxで変更した日付に紐づくデータが各入力値に入るようになっています。しかし、deleteリンクを押すと、デフォルトで入力されていた今日の日付のデータが消されてしまいます。
-
データがあればdeleteリンクを表示させるようにしたいのに、今日の日付データがない場合に日付変更しても、deleteリンクが表示されません。今日の日付データがある場合は表示され、今日の日付のデータをdestroyすることはできますが、日付変更すると1のようになってしまいます。
該当のソースコード
入力フォーム
<div class="modal-dialog" role="document"> <div class="modal-content"> <%= form_for @record, remote: true do |f| %> <!--エラーメッセージ省略--> <div class="form-group"> <%= f.label :date, for: "inputDate" %> <%= f.date_field :date, class: "form-control", id: "inputDate", value: @record.date %> </div> <p class="rcd-lbl">朝:</p> <div class="form-row"> <div class="form-group col-md-4"> <%= f.label :m_sbp, for: "inputM_SBP", class: "sr-only" %> <%= f.telephone_field :m_sbp, placeholder: "最高血圧", class: "form-control", id: "inputM_SBP", value: @record.m_sbp %> </div> <div class="form-group col-md-4"> <%= f.label :m_dbp, for: "inputM_DBP", class: "sr-only" %> <%= f.telephone_field :m_dbp, placeholder: "最低血圧", class: "form-control", id: "inputM_DBP", value: @record.m_dbp %> </div> <!--入力フォーム省略--> <div class="form-group"> <%= f.submit "記録する", class: "btn btn-block btn-blue", id: "record-btn" %> </div> <% end %> <% unless current_user.records.find_by(date: @record.date).nil? %> <%= form_for current_user.records.find_by(date: @record.date), html: { method: :delete } do |f| %> <%= f.submit "削除する", class: "btn" %> <% end %> <% end %> </div> </div>
controller(searchはAjaxで使用)
ruby
1def destroy 2 @record = current_user.records.find_by(date: params[:date]) 3 respond_to do |format| 4 if @record.destroy 5 format.html { redirect_to root_url, notice: '記録を削除しました。'} 6 format.js 7 else 8 format.js { render :edit } 9 end 10 end 11end 12 13def search 14 @record = current_user.records.find_by(date: params[:date]) 15 respond_to do |format| 16 if @record.nil? 17 @record = Record.new(date: params[:date]) 18 format.json { render json: @record } 19 else 20 format.json { render json: @record } 21 end 22 end 23end
Ajax(日付フィールド変更時に稼働)
javascript
1$(document).on('change', '#inputDate','turbolinks:load', function(){ 2 var inputDate = $("#inputDate").val(); 3$.ajax({ 4 url: '/records/search', 5 type: 'GET', 6 data: ('date=' + inputDate), 7 processData: false, 8 contentType: false, 9 dataType: 'json' 10 }) 11 .done(function(data){ //変更された日付のデータを格納 12 $("#inputM_SBP").val(data.m_sbp); 13 $("#inputM_DBP").val(data.m_dbp); 14 // 省略(入力フォーム) 15 if(inputDate == "") { 16 // 省略(記録するボタンの表示・非表示切り替え) 17 } 18 }) 19 .fail(function(data){ // 20 $("#inputM_SBP").val(""); 21 $("#inputM_DBP").val(""); 22 // 省略(入力フォーム) 23 }) 24});
試したこと
Ajaxで変更された日付に紐づくデータと一緒に、destroyのform_forを更新できないかな?と調べて見ましたがよくわからず。。。。
補足情報(FW/ツールのバージョンなど)
・ruby 2.6.5
・rails 6.0.2
何かヒントや参考記事だけでも良いのでアドバイスいただけると大変助かります。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。