【Rails】게시판 코멘트 기능 실장(메모)

목표



댓글 기능 구현





환경


  • Rails: 6.1.3
  • ruby: 3.0.0
  • mac: os

  • 전제


  • 게시판 게시 기능 구현 완료
  • 게시 테이블 이름 post

  • 구현



    1. 모델 만들기



    터미널
    $ rails g model Comment comment:string post:references
    

    생성된 마이그레이션 파일.
    지금 생각하면 모델명도 코멘트명도 comment에서 혼란스러워 버린 생각이 듭니다. .
    class CreateComments < ActiveRecord::Migration[6.1]
      def change
        create_table :comments do |t|
          t.string :comment
          t.references :post, null: false, foreign_key: true
    
          t.timestamps
        end
      end
    end
    

    마이그레이션 실행.

    터미널
    $ rails db:migrate
    

    2. 모델 연관



    app/models/post.rb
    class Post < ApplicationRecord
      has_many :comments, dependent: :destroy
    

    게시물에는 여러 개의 코멘트가 있으므로 has_many :commentspost 투고를 삭제했을 때 추종해, 코멘트도 사라지기를 바라므로 dependent: :destroy 를 추기.

    app/models/comment.rb
    class Comment < ApplicationRecord
      belongs_to :post
    

    1개의 코멘트는 1건의 투고에 속하고 있네요.
    이 연관 부분은 매우 중요합니다.

    3. 라우팅 추가



    config/routes.rb
    Rails.application.routes.draw do
      resources :posts do
        resources :comments
      end
    end
    

    중첩된 라우팅을 설명.rails routes 에서 확인하면 post_commnts POST/posts/:post_id/commnts(.:format) 입니다.

    4. 컨트롤러 작성



    터미널
    $ rails g controller Comments
    

    생성 app/controller/comments.rbcreate 액션 설명.

    app/controller/comments.rb
    class CommentsController < ApplicationController
    
      def create
        @post = Post.find(params[:post_id])
        @comment = @post.comments.create(comment_params)
        if @comment.save
          flash[:success] = 'コメントを投稿しました'
          redirect_to post_path(@post)
        else
          flash[:danger] = 'コメント投稿に失敗しました'
          redirect_back(fallback_location: posts_path)
        end
      end
    end
    
    private
    
    def comment_params
      params.require(:comment).permit(:comment)
    end
    

    5. 뷰에 설명



    게시물 상세 페이지에 댓글 게시 양식과 댓글 목록을 만듭니다.

    app/views/posts/show.html.erb
    <%= form_with(model:[ @post, @post.comments.build ], local:true) do |form| %>
    
        <div class="form-group">
            <p>
                <%= form.label 'コメント(255文字未満)' %>
                <%= form.text_area :comment,class: 'form-control' %>
            </p>
        </div>
        <div class="form_action row">
            <%= form.submit 'コメント投稿',class: 'btn btn-primary' %>
        </div>
    <% end %>
    

    코멘트한 유저의 이름과 작성 시간, 코멘트 내용의 기술.

    app/views/posts/show.html.erb
    
    <% @post.comments.each do |comment| %>
       <P><%= comment.user.name %> : <%= comment.created.at %></p>
    
       <p><%= commet.comment %></p>
    <% end %>
    

    거꾸로는하고 있습니다만, 이것으로 투고에 대한 코멘트 기능을 사용할 수 있을 것입니다.

    참고



    참고로 한 기사입니다.
    htps : // 코 m / 삼각형 / ms / 2034764897 c6 91 에 f982
    htps : // 이 m/__코타로_/있어 ms/8아 6b다 99다 b61d2아 72아 5

    좋은 웹페이지 즐겨찾기