非同期でコメント機能作ってみた
3660 ワード
今回は非同期通信を用いたコメント機能を実装していきたいと思います
前提
・コントローラー作成済み
・モデル作成済み
・リレーション設定済み
それでは実装していきましょう
①viewを作成
views/comments/_comment.html.erb
<p>コメント件数:<%= pet.comments.count %></p>
<% pet.comments.each do |comment| %>
<%= comment.user.full_name %>
<%= comment.created_at.strftime('%Y/%m/%d') %><%= simple_format comment.comment %>
<% if comment.user == current_user %>
<div class="comment-delete">
<%= link_to "削除", pet_comment_path(comment.pet, comment), method: :delete, remote: true %>
</div>
<% end %>
<% end %>
<div class="new-comment">
<%= form_with(model:[pet, comment], remote: true) do |f| %>
<%= f.text_area :comment, size:"90x5" ,placeholder: "コメントをここに" %>
<%= f.submit "送信する" %>
<% end %>
</div>
②作成した部分テンプレートを呼び出す
<div class="comments_<%= @pet.id %>">
<%= render 'comments/comment', pet: @pet, comment: @comment %>
</div>
③コントローラー編集
class CommentsController < ApplicationController
def create
@pet = Pet.find(params[:pet_id])
comment = Comment.new(comment_params)
comment.user_id = current_user.id
comment.pet_id = @pet.id
comment.save
@comment = Comment.new
end
def destroy
@pet = Pet.find(params[:pet_id])
Comment.find_by(id: params[:id], pet_id: params[:pet_id]).destroy
@comment = Comment.new
end
private
def comment_params
params.require(:comment).permit(:comment)
end
end
④ jQueryの記述
rudy:comments/create.js.erb
$(".comments_<%= @pet.id %>").html("<%= j (render 'comments/comment', pet: @pet, comment: @comment) %>");
$("text_area").val("");
comments/destroy.js.erb
$(".comments_<%= @pet.id %>").html("<%= j (render 'comments/comment', pet: @pet, comment: @comment) %>");
注意:
部分テンプレートを呼び出したviewのコントローラーに
@comment = Comment.new
@comments = Comment.all
を記述するのを忘れないように!
これがないとコメントを呼び出せないよ
以上で非同期コメント完成!!
Author And Source
この問題について(非同期でコメント機能作ってみた), 我々は、より多くの情報をここで見つけました https://qiita.com/corogit/items/d2b6e75a36ecb3836f66著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .