前言
在前面四篇學習筆記中,提到了article的新增、建立、刪除、編輯、顯示,接下來,
則是談到在每篇文章中,都有可以留言的功能,意味著一個文章可以有多篇留言,
簡單來說,是一種階層關係,所以,本篇就來討論,加入留言功能後,的實作流程。
6.Add a second model
首先在command line中輸入:
$ bin/rails generate model Comment commenter:string body:text article:references
關鍵在於,“article:references”,把model Article 與 model Comment做關聯,因此會在model/comment.rb
會看到這行“belongs_to:article”,甚至在資料庫中還看到這行:
t.references:article, index:true
接著去,執行migration動作。
6.2關聯模型
在model Article中,加入有很多comments的指令
classArticle < ActiveRecord: :Base
has_many:comments
validates:title, presence:true,
length: { minimum:5}
end
接著去把Route加入與comment的連接,
resources: articles do
resources:comments
end
建立好model、資料庫、Route後,接著往controller著手!
因為留言功能通常是在檢視玩文章,然後去留言板進行新增、刪除的功能,
所以不管是新增、刪除後,兩者執行完,都得回到 article/show,html.erb的畫面,
因此,在上述檔案中加入這些:
Add a comment:
<%= form_for([@article, @article.comments.build]) do |f| %>
<%= f.label :commenter %>
<%= f.text_field :commenter %>
<%= f.label :body %>
<%= f.text_area :body %>
<%= f.submit %>
<% end %>
在article新增一comment是透過Comment的controller中的creat action建立,
而這裡的form_for 使用到一個建立nest route的陣列,就像articles/1/comments
於是在Comment controller加上
def create
@article=Article.find(params[:article_id])
@comment=@article.comment.create(comment_params)
redirect to article_path(@article)
end
private
def comment_params
params.require(:comment).permit(:commenter, :body)
end
與Article controller對照
不僅是add comment,同時也得在view中顯示 comment的成果,
像是
Comments
<% @article.comments.each do |comment| %>
Commenter:
<%= comment.commenter %>
Comment:
<%= comment.body %>
<% end %>
最後可以完成,新增留言板、顯示留言板的功能!
ps.有引用的,代表自己不熟悉的,得再反復琢磨。