質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1291閲覧

Ajax で日付変更したあとに destroy すると前のデータが消されてしまう

mikannOishiii

総合スコア6

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/04/20 03:11

編集2020/04/20 03:13

前提・実現したいこと

日付に対してデータがある場合とない場合でdestroyリンクを動的に表示。
入力されている日付に紐づくデータをdestroyできるようにしたい。

仕様

日付に対してその日の血圧を記録するアプリを作っています。
モーダルフォーム(form_for)の日付フィールドにはデフォルトで今日の日付が入っていて、
今日のデータがあれば update, なければ create されます。
日付フィールドを変更すれば、変更された日付に紐づくデータ(Ajaxで取得)も編集・更新できます。

new, create, edit, update までは実装ができましたが、
destroyがうまく実装できません。

(画面イメージ)
イメージ説明
デザインを入れ込んでいませんが、一番下の「delete」を押すとデータが消されるようにしたいです。

発生している問題・エラーメッセージ

  1. 日付フィールドを変更すると、Ajaxで変更した日付に紐づくデータが各入力値に入るようになっています。しかし、deleteリンクを押すと、デフォルトで入力されていた今日の日付のデータが消されてしまいます。

  2. データがあれば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

何かヒントや参考記事だけでも良いのでアドバイスいただけると大変助かります。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

知り合いのエンジニアに助けてもらって、自己解決できました。
結論としては、Ajaxでdoneのときに送信先を書き換えてあげる ということでした。
試行錯誤して、以下の方法でできました。

<% if @record.id != nil %> <%=link_to "削除する", @record, id: "destroy_form", class: "btn btn-gray", method: :delete, data: { confirm: "本当に削除しますか?" } %> <% else %> <%=link_to "削除する", @record, id: "destroy_form", class: "btn btn-gray disabled", method: :delete, data: { confirm: "本当に削除しますか?" } %> <% end %>

@record の id があるかないかの条件分岐を入れて、今日の日付のデータがまだ登録されていないときはボタンを非アクティブにしています。if文がないと、データが登録されていない時も表示されてしまい、ボタンをクリックするとエラーになってしまいます。
@record だけでも最初はできると思いましたが、上に入力フォームがあるせいかできませんでした。

Javascript

1 .done(function(data){ //変更された日付のデータを格納 2 $("#inputM_SBP").val(data.m_sbp); 3 $("#inputM_DBP").val(data.m_dbp); 4 // 省略(入力フォーム) 5 $("#destroy_form").attr("action", `/records/${data.id}`); 6 $("#destroy_form").attr("href", `/records/${data.id}`); 7 if(data.id == null){ 8 $("#destroy_form").addClass('disabled'); 9 } else { 10 $("#destroy_form").removeClass('disabled'); 11 } 12

attr で属性値actionhrefの値を取得して、デフォルトでは **/records/**になっている値をid入りの値に書き換えています。両方の属性値を書き換えないとうまく動きませんでした。

また、変更された日付のデータがあるときは disabled のクラスを外して、データがないときはクラスを追加するようにして、削除ボタンの活性化の切り替えをしています。

def destroy @record = current_user.records.find(params[:id]) respond_to do |format| @record.destroy format.html { redirect_to root_url, notice: "記録を削除しました。"} format.js end end

データのあるときだけリンクボタンが動作するようになっているので、余計なif文を削除しました。

ちなみに、form_forだと、こんな感じで実装できます。

<%= form_for @record, html: { method: :delete, id: "destroy_form" } do |f| %> <%= f.submit "削除する", class: "btn" %> <% end %>
$("#destroy_form").attr("action", `/records/${data.id}`);

link_toでは actionhrefの書き換えが必要でしたが、form_forではactionのみでできました。ですが、上記のコードには、上述の通り、さらにhtmlで記録のあるなしをif文で判定する処理が必要になるので、link_toで今回は実装しました。

投稿2020/05/02 05:41

mikannOishiii

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問