前提・実現したいこと
投稿された記事に対してコメント機能をjs.erbファイルを用いて部分的に非同期で変更したのですが、コメントする前に読み込めれていたjsがコメントを投稿後に反応しなくなりました。
また、非同期でのコメント機能は正常に動作しています。
特にエラーなどはでず、コメントの送信ボタンを押すとコメント保存されています
該当のソースコード
Ruby
1# view/articles/index.html.erb 2 3<div class="timeline-content"> 4 <div id="scroll"> 5 <% @articles.each do |article| %> 6 <div class="card"> 7 <div class="card-top"> 8 <div class="left-side"> 9 <%= image_tag article.celeb.image, class: "image"%> 10 <div class="profile"> 11 <p style="font-weight: bold;"><%= article.celeb.name%></p> 12 <p><%= l article.created_at, format: :short %></p> 13 </div> 14 </div> 15 <div class="right-side"> 16 <i class="fa fa-bars"></i> 17 <div class="down-bar hidden"> 18 <% if @current_celeb && article.celeb.id == @current_celeb.id%> 19 <ul> 20 <li><%= link_to "削除", article_path(article.id), method: :delete ,class: "card-bar"%></li> 21 <li><%= link_to "編集", edit_article_path(article) ,class: "card-bar"%></li> 22 <li><%= link_to "公開設定を変更","#" ,class: "card-bar"%></li> 23 </ul> 24 <% else %> 25 <ul> 26 <li><%= link_to "この投稿を非表示にする", edit_article_path(article) ,class: "card-bar"%></li> 27 <li><%= link_to "この投稿者の投稿を非表示","#" ,class: "card-bar"%></li> 28 <li><%= link_to "この投稿を通報する","#" ,class: "card-bar"%></li> 29 </ul> 30 <% end %> 31 </div> 32 </div> 33 </div> 34 <div class="card-body"> 35 <% if article.image.attached? %> 36 <div class="samune"> 37 <%= image_tag article.image, class: "samune-image"%> 38 </div> 39 <% end %> 40 <p class="card-title"><%= article.title%></p> 41 <p class="card-text"><%= article.content%></p> 42 </div> 43 <div class="card-like" id="like-<%= article.id%>"> 44 <%= render partial: "like" , locals: {article: article}%> 45 </div> 46 <% if current_user %> 47 <%= form_with model: @comment, url: article_comments_path(article.id), remote: true do |f|%> 48 <div class="comment-space"> 49 <%= image_tag current_user.image, class: "comment-user-img"%> 50 <%= f.text_area :content, class: "comment", placeholder: "コメントを入力"%> 51 <%= f.submit "送信", class: "comment-submit"%> 52 </div> 53 <% end %> 54 <% end %> 55 <div class="comment-body" id="comments-<%= article.id%>"> 56 <%= render partial: "comment", locals: {article: article} %> 57 </div> 58 </div> 59 <% end %> 60 <div class='hidden'><%= paginate @articles %></div> 61 </div> 62</div> 63
Ruby
Ruby
1# view/articles/_comment.html.erb 2 3<% unless article.comments.empty? %> 4 <div class="comment-index"> 5 <p class="more-comment">コメント<%= article.comments.count%>件</p> 6 <div class="comments hidden"> 7 <% article.comments.each do |comment| %> 8 <div class="comments-set"> 9 <div class="left-side"> 10 <%= image_tag comment.user.image, class: "comment-user-img"%> 11 <div class="comment-profile"> 12 <div class="comment-time"> 13 <p style="font-weight: bold;"><%= comment.user.nickname%></p> 14 <p style="color: #868686;"><%= l comment.created_at, format: :short%></p> 15 </div> 16 <p class="comment-content" style="color: #868686;"><%= comment.content%></p> 17 </div> 18 </div> 19 <div class="right-side"> 20 <% if current_user && comment.user_id == current_user.id%> 21 <%= link_to "×", article_comment_path(article.id, comment.id), method: :delete, class: "delete-btn", remote: true%> 22 <% end %> 23 </div> 24 </div> 25 <% end %> 26 </div> 27 </div> 28<% end %>
Ruby
1# view/comments/create.js.erb 2 3$('#comments-<%= @article.id%>').html("<%= j(render partial: 'articles/comment', locals: {article: @article}) %>");
Ruby
1# view/comments/destroy.js.erb 2 3$('#comments-<%= @article.id%>').html("<%= j(render partial: 'articles/comment', locals: {article: @article}) %>");
JavaScript
1 2$(document).on("turbolinks:load", function() { 3 var article = function(){ 4 5 ### .more-commentの要素をクリックするとコメントの一覧が出現する 6 const MoreComment = document.querySelectorAll(".more-comment") 7 MoreComment.forEach((comment) => { 8 comment.addEventListener("click", () => { 9 const CommentIndex = comment.parentNode.querySelector(".comments") 10 if (CommentIndex.classList.contains("hidden")){ 11 const Comments = document.querySelectorAll(".comments") 12 Comments.forEach(com => com.classList.add("hidden")) 13 } 14 CommentIndex.classList.toggle("hidden") 15 }) 16 }) 17 18 ### .right-sideの要素をクリックすると、サイドのバーが出現する 19 const DownMenu = document.querySelectorAll(".right-side") 20 DownMenu.forEach((icon) => { 21 icon.addEventListener("click", () => { 22 const DownBar = icon.parentNode.querySelector(".down-bar") 23 if (DownBar.classList.contains("hidden")){ 24 const DownBars = document.querySelectorAll(".down-bar") 25 DownBars.forEach(bar => bar.classList.add("hidden")) 26 } 27 DownBar.classList.toggle("hidden") 28 }) 29 }) 30 31 ### コメントの記入欄の高さが改行に応じて変化する 32 var lineHeight = parseInt($('.comment').css('lineHeight')); 33 $('.comment').on('input', function() { 34 var lines = ($(this).val() + '\n').match(/\n/g).length; 35 $(this).height(lineHeight * lines); 36 }); 37 } 38 39 article(); ## 上で定義したarticleをturbolinksが読み込まれたら実行 40 41 $(document).on('scrollThreshold.infiniteScroll', function() { 42 article(); 43 }) 44 $(document).on('append.infiniteScroll', function() { 45 article(); 46 }) ## InfiniteScrollを用いて無限スクロールを導入しているので新たに画面が読み込まれたらこちらの二つを実行 47 48 $(".comment-body").on("DOMSubtreeModified propertychange",function(){ 49 $(".comment").val; 50 article(); 51 }); ## classのcomment-bodyに新たにDOMが加えられたらこちらを実行。しかしうまくいかなかった。 52 53});
試したこと
新しくコメントがDOMとして追加されたらというのを”DOMSubtreeModified propertychange”としてイベント発火させようとしたのですが、コメントが投稿されても発火しませんでした。
補足情報(FW/ツールのバージョンなど)
rails 6.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/09 02:21
2021/04/09 02:23
2021/04/09 02:56
2021/04/09 04:12
2021/04/09 04:25
2021/04/09 04:38