Rails 비동기 통신 (ajax)
리로드하지 않으면 투고한 코멘트가 표시되지 않는 상태였으므로 ajax로 구현했습니다.
기사에 표시는
tops_controller.rb
코멘트도 이 안의 액션에 기술하고 있습니다.완성형
어소시에이션
article.rb
has_many :comments, dependent: :destroy
comment.rb
belongs_to :article
댓글 만들기
tops_controller.rb
def show
@article_id = Article.find(params[:id]) #記事id取得
@comment = Comment.new #コメント作成
@comments = @article_.comments #記事に紐づくコメント全取得
# @comments = Comment.where(article_id: @article_id) 上と同じ意味(書かなくていい)
session[:article_id] = @article_id.id #sessionに格納して次のアクションでも使えるように
end
def create
@article_id = Article.find_by(id: session[:article_id]) #記事id取得
@comment = Comment.new(comment_params) #コメント作成
@comment.article_id = @article_.id #アソシエーションしてるのでarticle_idを指定
if @comment.valid? #バリデーションひっかってるか確認
@comment.save #大丈夫そうだったら保存
@comments = [] #空配列を定義
@comments << @comment #@commentsに今作った@commentをpush・・・comment_lists.html.erbで使う
render :comment_lists (アクションは必要ない(このファイルのjs.erbファイルを作る))
else
render :action => "show"
end
end
_comment_form.html.erb
<%= form_with model: [@article_id, @comment], :url => { :action => 'create' } do |f| %>
#@article_idは記事ID取得の変数、@commentはコメント作成の変数
<div class = "form">
<div class="label">
<%= f.label(:name)%>
</div>
<div class="parts clearfix">
<%= f.text_field :name, :class => 'text' %>
</div>
</div>
<div class = "form">
<div class="label">
<%= f.label(:email) %>
</div>
<div class="parts clearfix">
<%= f.text_field :email, :class => 'text' %>
</div>
</div>
<div class = "form">
<div class="parts clearfix">
<%= f.text_area :content, :placeholder => "コメント内容", :class => 'text' %>
<%= error_on(:comment, :content)%>
</div>
</div>
<div class = btn_wrap>
<%= f.submit "コメントする", :class => "check" %>
</div>
<% end %>
comment_lists.html.erb
<% if @comments %>
<% @comments.each_with_index do |comment,i| %>
<div class="comment_box">
<div class ="wrap">
<div class = "id"><%= link_to "#{i+1}", new_reply_path %></div>
<div class = "name"><%= comment.name %></div><br>
<div class = "date"><%= comment.created_at.strftime("%Y/%m/%d %H:%M")%></div>
</div>
<div class ="content"><%= comment.content %></div>
</div>
<% end %>
<% end %>
comment_lists.js.erb
// 内容消してる
$('textarea').val('');
$('input').val('');
//コメント一覧に今作成したコメントを追加(動的に)
$('.comment_lists').append('<%= j(render 'comment_lists') %>'
);
참고 URL 2개를 참고에 써 있던 ↓에 달려 있다
collection:
에 기술하고 있는 변수는, 단지 comment_lists.html.erb
정의하고 있기 때문에 필요하지 않은 것 같습니다.$('.comment_lists').append('<%= j(render 'comment_lists'), collection: @comments) %>');
참고 기사
@comments
htps : // ysk-p 여. 하테나 bぉg. 코m/엔트리/2018/02/10/101739
Reference
이 문제에 관하여(Rails 비동기 통신 (ajax)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rainbow___0/items/bfd5d668cb72e98399a3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)