【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.rbdef show
@post_image = PostImage.find(params[:id])
@comment = Comment.new
end
comments/controller.rbdef 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.rbvalidates :comment, presence: true
2. 컨트롤러를 조건 분기
로컬 변수 comment의 save에 실패했을 경우, comment는 에러 내용을 포함한 것으로 알 수 있다. 이 상태를 뷰에 반영하기 위해 (에러 메시지를 표시) 인스턴스 변수 @ error_comment에 오류 내용을 포함하는 comment를 재정의해야합니다.
comments/controller.rbdef 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.rbdef show
@post_image = PostImage.find(params[:id])
@post_comment = PostComment.new
end
추가한다.
comments/controller.rbdef 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.rbdef 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
요약
매우 돌아다니는 설명이 되었습니다만, 초학자 쪽에서 에러 해결에 고생하고 있는 분등의 참고가 되면 다행입니다.
Reference
이 문제에 관하여(【Rails】코멘트 기능의 에러 메시지 표시 방법(초학자용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/codeReona/items/f78ffc13d93f43926267
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
사용자 게시물에 댓글을 달 수 있는 일반적인 응용 프로그램입니다. (사용자 등록은 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.rbvalidates :comment, presence: true
2. 컨트롤러를 조건 분기
로컬 변수 comment의 save에 실패했을 경우, comment는 에러 내용을 포함한 것으로 알 수 있다. 이 상태를 뷰에 반영하기 위해 (에러 메시지를 표시) 인스턴스 변수 @ error_comment에 오류 내용을 포함하는 comment를 재정의해야합니다.
comments/controller.rbdef 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.rbdef show
@post_image = PostImage.find(params[:id])
@post_comment = PostComment.new
end
추가한다.
comments/controller.rbdef 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.rbdef 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
요약
매우 돌아다니는 설명이 되었습니다만, 초학자 쪽에서 에러 해결에 고생하고 있는 분등의 참고가 되면 다행입니다.
Reference
이 문제에 관하여(【Rails】코멘트 기능의 에러 메시지 표시 방법(초학자용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/codeReona/items/f78ffc13d93f43926267
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
validates :comment, presence: true
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
<%= 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 %>
def show
@post_image = PostImage.find(params[:id])
@post_comment = PostComment.new
end
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
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
매우 돌아다니는 설명이 되었습니다만, 초학자 쪽에서 에러 해결에 고생하고 있는 분등의 참고가 되면 다행입니다.
Reference
이 문제에 관하여(【Rails】코멘트 기능의 에러 메시지 표시 방법(초학자용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/codeReona/items/f78ffc13d93f43926267텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)