分享

[Rails][notes] Second Model官網閱讀紀錄[5]

記錄自己官網文件閱讀的注釋與筆記
主要也是訓練自己閱讀英文挑戰
   https://guides.rubyonrails.org/getting_started.html

官網 文件 注釋 筆記 rails

7 Adding a Second Model

前一篇為Article完成了一整個MVC架構的CRUD 現在我們要建立第二個model,用來作為Article的comment。

7.1 Generating a Model

我們可以使用跟建立Article一樣的生成器,我們要建立一個comment 的model 並且參考article,我們可以在終端機執行:
  

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

這個指令將會產生
官網 文件 注釋 筆記 rails
接下來打開app/models/comment.rb:
  

class Comment < ApplicationRecord

  belongs_to :article

end

這看起來非常類似之前看到的Article model 。 不一樣的部分是
  

belongs_to :article

這一行將設定Active Record association
:references這個關鍵字所產生將會建立一個欄位用於相依參考的資料表
而產生 _id後綴的欄位,在這裡會在 comment表中產生article_id資料類型為
integer。
若想要更了解這部分可以分析db/schema.rb
  

class CreateComments < ActiveRecord::Migration[6.0]

  def change

    create_table :comments do |t|

      t.string :commenter

      t.text :body

      t.references :article, null: false, foreign_key: true


      t.timestamps

    end

  end

end

t.references 這一行 建立了名稱叫做article_id資料型態為integer 的欄位,
就像是一個索引,和一個外部鍵指向article的id。
接著執行
  

bin/rails db:migrate

從結果可以看見Rails 非常聰明的僅指行了尚未執行的migration
  

==  CreateComments: migrating =================================================

-- create_table(:comments)

   -> 0.0115s

==  CreateComments: migrated (0.0119s) ========================================

7.2 Associating Models

Active Record associations 可以讓你輕鬆地描述連結兩個model的關係
對於文章與評論可以寫下這個方法
  • 每個評論都屬於一篇文章
  • 一篇文章可以有很多評論
而這樣的寫法非常接近rails語法你只要在comment 跟article的model加入
如下
app/models/comment.rb
  

class Comment < ApplicationRecord

  belongs_to :article

end

app/models/article.rb
  

class Article < ApplicationRecord

  has_many :comments


  validates :title, presence: true

  validates :body, presence: true, length: { minimum: 10 }

end

這樣的連接開啟了許多Rails 自動為你添加好用的方法,例如你有一個含有一篇文章的@article,你可以用@article.comments 找到屬於這篇文章的所有評論。

7.3 Adding a Route for Comments

接著我們添加一個路徑讓rails 知道要導向哪裡去看評論
開啟config/routes.rb
  

Rails.application.routes.draw do

  root "articles#index"


  resources :articles do

    resources :comments

  end

end

comments路徑嵌入articles路經中

7.4 Generating a Controller

有了model後,可以轉移向controller ,我再一次的使用產生器
  

bin/rails generate controller Comments

官網 文件 注釋 筆記 rails
如同其他的BLOG,讀者在閱讀完文章後可以直接留下評論,一但留下評論後,將直接回到SHOW頁面可以查看他們留下的評論,因此我們的CommentsController將提供一些方法用來建立與刪除評論。
我們打開show 頁面app/views/articles/show.html.erb
  

<h1><%= @article.title %></h1>


<p><%= @article.body %></p>


<ul>

  <li><%= link_to "Edit", edit_article_path(@article) %></li>

  <li><%= link_to "Destroy", article_path(@article),

                  method: :delete,

                  data: { confirm: "Are you sure?" } %></li>

</ul>


<h2>Add a comment:</h2>

<%= form_with model: [ @article, @article.comments.build ] 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 %>

在Article 的show 頁面添加一個表單透過 CommentsController create action來建立新的評論。form_with 在這裡會調用一個陣列,將會建立一個巢狀的路徑,如同/articles/1/comments。
接著讓我們將create 寫進app/controllers/comments_controller.rb:
  

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


這裡會看到他比article的Create複雜很多這是因為使用了巢狀路徑的副作用,
每個評論都需要依附在它所評論的文章上,因此使用Article的model中的find方法,來找到需要評論的文章。
當我們找到文章後我們可以利用關連的方法來對評論做建立與儲存。
@article.comments.create()透過這個方法使其評論做關聯是的建立並儲存
做完評論的建立後,將頁面導向回用戶評論的文章article_path(@article)
如同上面所說導向回評論的頁面因此我們要建立顯示評論的部分
  

<h1><%= @article.title %></h1>


<p><%= @article.body %></p>


<ul>

  <li><%= link_to "Edit", edit_article_path(@article) %></li>

  <li><%= link_to "Destroy", article_path(@article),

                  method: :delete,

                  data: { confirm: "Are you sure?" } %></li>

</ul>


<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 ] 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 %>

現在就可以看到評論顯示在文章的下方
官網 文件 注釋 筆記 rails

引用自官網圖片https://guides.rubyonrails.org/getting_started.html#refactoring

#官網  #文件  #注釋  #筆記  #rails 
分類:學習

評論
上一篇
  • [Rails][notes] CRUD -U: Update官網閱讀紀錄[4]
  • 下一篇
  • [Rails][notes] Refactoring官網閱讀紀錄[6]
  • 更多文章
    載入中... 沒有更多了