【Rails】코멘트 기능의 에러 메시지 표시 방법(초학자용)

17167 단어 Rails초학자용

소개



본 기사는, 달려 엔지니어의 첫걸음! AdventCalendar2020 19일 의 기사입니다.

애플리케이션 개요



사용자 게시물에 댓글을 달 수 있는 일반적인 응용 프로그램입니다. (사용자 등록은 devise를 사용)
현재는, comment에 대한 밸리데이션은 설정되어 있지 않기 때문에, 빈 투고가 가능한 상태가 되어 있습니다.

ER 다이어그램





코멘트 기능



구현 전의 코멘트 기능의 view와 controller는 이하와 같습니다.

post_images/show.html.erb ※댓글 게시 부분만 발췌
<%= form_with model:[@post_image, @comment], local:true do |f| %>
  <div class="row">
    <div class="col-sm-12">
       <%= f.text_area :comment, rows:'5', class: "form-control",placeholder: "コメントをここに" %>
    </div>
  </div>
   <%= f.submit "送信する", class: "btn btn-lg btn-base-1 mt-20 pull-right" %>
<% end %>

post_images/controller.rb
def show
    @post_image = PostImage.find(params[:id])
    @comment = Comment.new
end


comments/controller.rb
def create
   post_image = PostImage.find(params[:post_image_id])
   comment = current_user.comments.new(comment_params)
   comment.post_image_id = post_image.id
   comment.save
   redirect_to post_image_path(post_image)
end

private
def comment_params
  params.require(:comment).permit(:comment)
end

주석 기능에 오류 메시지를 표시



1. 코멘트 모델의 검증 설정



models/comments.rb
validates :comment, presence: true

2. 컨트롤러를 조건 분기



로컬 변수 comment의 save에 실패했을 경우, comment는 에러 내용을 포함한 것으로 알 수 있다. 이 상태를 뷰에 반영하기 위해 (에러 메시지를 표시) 인스턴스 변수 @ error_comment에 오류 내용을 포함하는 comment를 재정의해야합니다.

comments/controller.rb
def create
    post_image = PostImage.find(params[:post_image_id])
    comment = current_user.post_comments.new(comment_params)
    comment.post_image_id = post_image.id

   #6行追加(if〜end)--------------------------------
    if comment.save
        redirect_to post_image_path(post_image)
    else
        @error_comment = comment
        render 'post_image/show'
    end
   #-----------------------------------------------
end

private
def comment_params
  params.require(:comment).permit(:comment)
end

3. 에러 메시지의 표시를 기재한다



방금 재정의한 @error_comment를 view에 건네준다.

post_images/show.html.erb ※댓글 게시 부분만 발췌
<%= form_with model:[@post_image, @post_comment], local:true do |f| %>

----エラーメッセージの表示を追加------------------------------------------------
  <% if @error_comment.present? %>
    <div id="error_explanation">
      <h2><%= @error_comment.errors.count %>件のエラーが発生しました。</h2>
      <ul>
        <% @error_comment.errors.full_messages.each do |message| %>
        <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
--------------------------------------------------------------------------

  <div class="row">
    <div class="col-sm-12">
      <%= f.text_area :comment, rows:'5', class: "form-control",placeholder: "コメントをここに" %>
    </div>
  </div>
  <%= f.submit "送信する", class: "btn btn-lg btn-base-1 mt-20 pull-right" %>
  <% end %>

2행째의 <% if @error_comment.present? %>에 에러가 있을 때만, 표시되도록(듯이) 한다. @ error_comment는 comment가 빈 게시물 일 때만 재정의되는 변수이므로 show 페이지를 표시 할 때 정의되지 않습니다.
<% if @error_comment.present? %>가 없으면 다음과 같은 오류가 발생합니다.


4. post_image의 show 액션 내용을 create 액션에 추가



코멘트 투고가 실패했을 경우, post_image의 show 페이지에 render 하도록(듯이) 하고 있지만, show의 view를 표시하는데 필요한 인스턴스 변수가 comment 콘트롤러의 create 액션에는 없기 때문에, 추기해 줄 필요가 있다.

post_images/controller.rb
def show
    @post_image = PostImage.find(params[:id])
    @post_comment = PostComment.new
end

추가한다.

comments/controller.rb
def create
    post_image = PostImage.find(params[:post_image_id])
    comment = current_user.post_comments.new(post_comment_params)
    comment.post_image_id = post_image.id
    if comment.save
        redirect_to post_image_path(post_image)
    else
        @error_comment = comment

#------post_imageのshowアクションを追加---------------
        @post_image = PostImage.find(params[:id])
        @post_comment = PostComment.new
#-------------------------------------------------
        render 'post_image/show'
    end
end

private
def comment_params
  params.require(:comment).permit(:comment)
end

이제 코멘트 투고를 실행해도 id가 없기 때문에 찾을 수 없다는 다음과 같은 메시지가 나온다. 정확하게는 id는 있지만 이름이 바뀌어 다른 것이 되어 있으므로 id를 찾을 수 없다는 느낌.
rails routes에서 확인하면,


Prefix
동사
URI 패턴
Controller#Action


post_image
GET
/post_images/:id(.:format)
post_image#show

post_image_comments
POST
/post_images/:post_image_id/comments(.:format)
comment#create


show 액션에서는 post_images의 파라미터 id는 :id이었지만, create 액션의 경우, 파라미터 id는 post_image_id이다. 따라서 파라미터 id를 post_image_id로 변경한다.

comments/controller.rb
def create
    post_image = PostImage.find(params[:post_image_id])
    comment = current_user.post_comments.new(post_comment_params)
    comment.post_image_id = post_image.id
    if comment.save
        redirect_to post_image_path(post_image)
    else
        @error_comment = comment
 #----------変更(:id → :post_image_id)------------------------
        @post_image = PostImage.find(params[:post_image_id])
 #------------------------------------------------------------
        @post_comment = PostComment.new
        render 'post_image/show'
    end
end

private
def comment_params
  params.require(:comment).permit(:comment)
end



요약



매우 돌아다니는 설명이 되었습니다만, 초학자 쪽에서 에러 해결에 고생하고 있는 분등의 참고가 되면 다행입니다.

좋은 웹페이지 즐겨찾기