iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

Rails 手工打造自己的部落格 系列 第 25

Rails 手工打造自己的部落格 25 - 留言

  • 分享至 

  • xImage
  •  

接下來我們可以做一個留言功能,
讓其他讀者在瀏覽網站的時候可以給出回饋,
或是可以在文章下面做出一些額外的討論,

建立新的model

  1. 建立新的model
rails g model Comment cotent:text user:belongs_to 
article:belongs_to  deleted_at:datetime:index
#belogs_to建立關聯,deleted_at 的屬性,類型為 datetime,
                  # 並添加了一個索引index
  1. 驗證欄位
    validates :content, presence: true
  2. 在user 和 article 的model 建立關聯
has_many :comments
  1. 在show 的下面 建立 comment 的 new 表單
<%= form_with(model: @comment) do |f| %>
<%end%>

在 article C 的 show 裡面把 comment new 出來

def show
	@comment = Comment.new
end
  1. 定義路徑 R
    使用 shallow 只需要 create 跟 destroy 功能
resources :articles do
	resources :comments,only: [:create, :destroy],
	 shallow: true 
end

shallow 會判斷路徑需不需要掛 article
6. 修改 show 的 V 表單路徑

<%= form_with(model: @comment,
              url: article_comment_path(@article.id)) do |f| %>  
              只給@comment會猜錯,給他路徑url 

# 也可多給一個@article讓表單去猜
<%= form_with(model: [@article, @comment]) do |f| %>
<%end%>

在 show V 裡面建立 input 表單

<%= form_with(model: [@article, @comment],data: {turbo: false})  do |f| %>
  <div> 
    <%= f.label :content, '留言內容' %><br />
    <%= f.text_area :content%>
  </div>
  
  <%= f.submit '新增留言'%>
<% end %>
  1. 按下submit後 , 會去找 CommentsController 的 create action
  2. 生成 controller
    rails g controller comments
  3. comment 的 C 建立create 的action
before_action :authenticated_user!    //登入後才能留言
before_action :find_article, only: [:create]   //找出文章的id
	def create
	    # @comment = Comment.new(comment_params)
	    # @comment.user = current_user 找作者是誰
	    # @comment.artcile = @artcile 找第幾篇文章
	    @comment = @artcile.comments.new(comment_params)
	    if @comment.save
	      #redirect_to articles_path(@artcile), notice: '留言成功'
	    else
	      render "articles/show"
	   end
	end

	private
  def find_article
    @article = Article.find(params[:article_id])
  end
	清洗
	def comment_params
    params.require(:comment)
          .permit(:content)
          .merge(user: current_user)
	end
  1. 在show 印出 所有留言
    article C > show
def show
	@comment = Comment.new
	@comments = @article.comments.order(id: :desc)
end

上一篇
Rails 手工打造自己的部落格 24 - 會員權限
下一篇
Rails 手工打造自己的部落格 26 - 搜尋
系列文
Rails 手工打造自己的部落格 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言