[Rails]評論功能

使用者可以為文章下comment。

第一步 : routes
使用shallow作法


resources :articles do
resources :comments, shallow: true
end

等於下面寫法

resources :articles do
resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]

「index」、「new」以及「create」 需要知道是哪個article id 
 「編輯」、「更新」以及「刪除」功能也沒有必要一定要跟在 article 後面 ,因為當comment建立後,comment就有id了,只要針對comments/:id 去找到他做「編輯」、「更新」以及「刪除」功能就好。

第二步 : 建立controller

rails g controller comments

第三步:建立MODEL

Comment會跟User和Article有關聯。User和Article都可以有很多Comment。 (一對多關係)

rails g model Comment content:text user:references article:references

  • Article has_many :comments , :dependent => :destroy

(加上:dependent => :destroy,是為了刪除文章時,底下的評論也要消失)

  • User has_many :comments

第四步建立view
由於評論希望能在文章下方顯示,且直接在文章下方發表評論。於是打算在articles/show.html.erb裡用局部渲染(Partial Render)的做法。

touch app/views/comments/_form.erb

第五步實作 create action

class CommentsController < ApplicationController
before_action :authenticate_user!, only: [:create, :destroy]
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.new(comment_params)
@comment.user = current_user
 if @comment.save
redirect_to article_path(@article), notice: ‘評論成功’
else
redirect_to article_path(@article), notice: ‘評論內容不得為空’
end
end
private
def comment_params
params.require(:comment).permit(:content)
end
end

並修改內容 app/views/comments/_form.html.erb

<%= simple_form_for [@article, @article.comments.build ] do |f| %>
<div class="">
<%= f.input :content, :label => "發表評論" %>
</div>
<div class="">
<%= f.submit "送出", class: "btn btn-sm btn-default ", data: {disable_with: "Submiting"} %>
</div>
<% end %>

由於要在articles/show頁面顯示出comment以及發表評碖。

app/controllers/articles_controller 的 show action 加上

 def show
@user = @article.user
+ @comments = @article.comments
end

並在 app/views/articles/show.html.erb

<!-- 評論 -->
<div class="article-commnet">
<% @comments.each do |comment| %>
<%= simple_format(comment.content) %>
<% end %>
<%= render "comments/form"%>
</div>

「待完成功能」

評論底下回覆評論 (self.references)

Like what you read? Give sihhan a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.