Ruby on Rails--給blog添加評論功能

通過前幾天的例子,我們建立了自己的第一個blog網站,並實現了對數據庫的CRUD操作,初步瞭解了Rails的MVC架構,使用rails generate model命令生成model文件,並執行rails db:migrate命令在數據庫中創建相應的表;使用generate controller命令生成controller文件,在controller文件中編寫業務流的控制程序,同時爲了給用戶一個直觀的展示,我們需要編寫一些views。Rails內置了一些路由,目前我們暫時不需要自己手動編寫,使用rails默認的路由就可以實現想要的這些功能了。

前面我們是以article爲對象,完整的學習了對其新建、變更、刪除等的各種操作。那麼怎麼對已經發表的博客文章進行評論呢?今天我們就一起來學習一下。

首先,我們還是使用rails generate model命令來創建一個關於評論的model:

$ bin/rails generate model Comment commenter:string body:text article:references

讓我們來看一下自動生成的model文件(app/models/comment.rb), 

class Comment < ApplicationRecord

  belongs_to :article

end

發現,這與之前生成的Article的model文件稍微有些區別,就是多了一個belongs_to語句,這是因爲我們在執行命令的時候使用了article:reference參數,它的作用是在生成comment這個表的時候多了一列用來存放article id,時article和comment這兩個表關聯起來 。

然後,我們執行rails db:migrate命令,我們發現雖然在blog/db/migrate的路徑下面除了我們這次生成的文件之外,也包括前幾天我們生成的article相關的文件,但是在執行命令的時候,rails還是很聰明地只創建了comment這個表,因爲article表已經存在了。

 現在,讓我們講article和comment兩個model進行關聯,對象與對象的關係可以是一對一,可以是一對多,也可以是多對多。而博客的文章與評論的關係應該是一對多的關係,我們在comment.rb文件中已經知道comment belongs_to :article;那麼在article.rb文件中如何來表示呢,我們使用語句has_many :comments。修改後的article.rb文件如下:

class Article < ApplicationRecord

  has_many :comments

  validates :title, presence: true,

                    length: { minimum: 5 }

end

 這樣我們就建立了article與comment之間的關係,假如我們使用一個實例變量@article表示一個文章,那麼就可以使用@article.comments來表示關於這篇文章的所有評論了。

給article添加路由的時候,我們是在blog/config/routes.rb文件中添加了這麼一句代碼:

resources :articles

 由於comment與article的特殊關係,我們只需要把routes.rb文件變更如下便可以指定comment的路由了。

resources :articles do

  resources :comments

end

上述操作完成之後,讓我們來生成comment相關的controller,執行rails generate controller命令:

$ bin/rails generate controller Comments

 我們需要在展示article的頁面中加入comment相關的內容,現在讓我們講前幾天編寫的有關article的show.html.erb這個view修改如下:

<p>

  <strong>Title:</strong>

  <%= @article.title %>

</p>

 

<p>

  <strong>Text:</strong>

  <%= @article.text %>

</p>

 

<h2>Comments</h2>

<% @article.comments.each do |comment| %>

  <p>

    <strong>Commenter:</strong>

    <%= comment.commenter %>

  </p>

 

  <p>

    <strong>Comment:</strong>

    <%= comment.body %>

  </p>

<% end %>

 

<h2>Add a comment:</h2>

<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>

  <p>

    <%= form.label :commenter %><br>

    <%= form.text_field :commenter %>

  </p>

  <p>

    <%= form.label :body %><br>

    <%= form.text_area :body %>

  </p>

  <p>

    <%= form.submit %>

  </p>

<% end %>

 

<%= link_to 'Edit', edit_article_path(@article) %> |

<%= link_to 'Back', articles_path %>

 當然,不要忘記在comment的controller中添加create方法,

class CommentsController < ApplicationController

  def create

    @article = Article.find(params[:article_id])

    @comment = @article.comments.create(comment_params)

    redirect_to article_path(@article)

  end

 

  private

    def comment_params

      params.require(:comment).permit(:commenter, :body)

    end

end

啓動服務後程序執行如下:

 

點擊按鈕之後頁面:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章