검증 부족으로 인한 오류 해결 ~ Active Storage를 사용하여 이미지 투고 기능을 설치하는 동안 발생합니다.
7514 단어 RubyRailsActiveStorage
입문
・ 투고자는 최초의 학자이기 때문에 때때로 잘못된 정보를 투고한다.그때는 천만에요.
이번 오류의 원인
이미지 데이터의 검증이 부족하기 때문에 이미지와 조립하여 투고해야 하지만 이미지가 없는 상태에서 데이터를 저장할 수 있습니다.
따라서 그림이 없는 데이터를 받은 보기 파일이 혼란스러워 오류가 발생했습니다.
다음은 자세한 내용입니다.
이미지 투고의 구현 절차
설치 이미지 투고 기능
ActiveStorage
을 가져왔습니다.그리고 다음 순서대로 준비를 했습니다.
먼저 투고 데이터와 이미지 데이터를 1대 1의 관계로 기록한다.
models/prototype.rb
class Prototype < ApplicationRecord
belongs_to :user
has_one_attached :image #1対1の関係になる
has_many :comments, dependent: :destroy
validates :title, :catch_copy, :concept, presence: true
end
이어서 다음과 같이 컨트롤러를 고쳐 씁니다.controllers/prototypes_controller.rb
def create
@prototype = Prototype.create(prototype_params)
if @prototype.save
redirect_to root_path
else
render :new
end
end
private
def prototype_params
params.require(:prototype).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id)
end
prototype_params
에 추가:image
를 통해 투고 데이터에 이미지도 첨부하도록 설정합니다.이어서viwe 파일을 조정합니다.
views/prototypes/index.html.erb
<div class="card__wrapper">
<%= render partial: 'prototype', collection: @prototype, locals: { prototype: @prototype } %>
</div>
views/prototypes/_prototype.html.erb<div class="card">
<%= link_to image_tag(prototype.image, class: :card__img ), prototype_path(prototype.id) %>
<div class="card__body">
<%= link_to prototype.title, prototype_path(prototype.id), class: :card__title %>
<p class="card__summary">
<%= prototype.catch_copy %>
</p>
<%= link_to "by #{prototype.user.name}", user_path(prototype.user.id), class: :card__user %>
</div>
</div>
오류 발생
투고의 내용은'투고물의 이름','홍보 표어','개념'과 방금 설정한'이미지'등 총 4개다.
로컬 환경에서 동작 확인을 할 때 이미지가 없는 상태에서 투고할 때 투고가 튀어나오지 않아 다음과 같은 오류 화면이 발생했습니다.
자세히 보니 위에서 세 번째 줄을 세었다
Can't resolve image into URL: to_model delegated to attachment, but attachment is nil
적혀 있음을 알 수 있다.Can't resolve image/attachment is nil이라고 쓰여 있기 때문에'이미지가 없어서 오류가 발생했습니다'라고 말하는 것으로 이해할 수 있습니다.
오류 해결 가설
오류가 발생하기 전에 진행된 동작과 오류 화면을 고려하여 다음과 같은 가설을 얻었다.
1. 그림이 없는 상태에서 투고하는 중 오류가 발생했습니다.
2. 오류 화면에 표시된 코드는 보기 파일이고 빨간색은 이미지를 표시하는 코드입니다.
=> 존재해야 할 이미지 데이터가 없어서 보기 파일의 코드가 혼란스러운지 여부입니다.
=> 이미지만 있는 상태에서 투고하면 튀어나오지 않으면 이미지 데이터의 검증이 제대로 이루어지지 않잖아요.
이 두 가지 가설을 바탕으로 모델의 파일을 엿보았는데 과연 이미지 데이터의 검증이 부족했다.
잘못
models/prototype.rb
class Prototype < ApplicationRecord
belongs_to :user
has_one_attached :image #1対1の関係になる
has_many :comments, dependent: :destroy
validates :title, :catch_copy, :concept, presence: true
end
정수models/prototype.rb
class Prototype < ApplicationRecord
belongs_to :user
has_one_attached :image #1対1の関係になる
has_many :comments, dependent: :destroy
validates :title, :catch_copy, :concept, :image, presence: true
end
validates :image
탈락으로 인한 오류.이것은 검증을 초래하고 오류의 원인을 없앴다.
오류 화면이 사라지지 않습니다(여담)
재설정 인증의 원인은 해제되었지만 서버와 PC를 다시 시작해도 잘못된 화면에서 벗어날 수 있습니다.처음에 나는 각양각색의 서류를 보았는데, 틀림없이 다른 누락된 부분이 있다고 생각했지만, 나는 잘못이 없다고 생각했다.
머리를 안고 휴일의 반나절을 보낸 이유는 간단하다.
다만 검증 설정 전에 저장된 이미지가 없는 투고 데이터가 존재하기 때문에 오류 화면에서 벗어날 수 없습니다.
Sequel Pro를 사용하여 그림이 없는 투고 데이터를 기록과 함께 직접 삭제하면 오류를 순조롭게 제거할 수 있습니다.
Heroku가 배치된 후에도 아래의 블로그를 참고하여 해결할 수 있기 때문에 이것을 잊지 않기 위해 기술해야 한다.
참고 문헌
Heroku 배포된 DB를 SequelPro로 연결해 보십시오.
[Active Storage] 파일 업로드 시 유효성 검사 설정
[초보자를 위한] Rails의 Active Record에 대한 설명 & 방법 요약
매우 참고 가치가 있다.
감사합니다.
감상
'검증 제거'든'이미지가 없는 투고 데이터'든 모두 사소한 원인이지만 해결하기 전에 십여 시간이 걸렸다.
잘못된 화면, 고통, 슬픔 등 다양한 감정이 쏟아져 나와 울컥하지만, 해결될 때 맑은 기분이 된다.'프로그래밍 최고!'혼자 떠들썩해지기 시작했다.
잘못으로 좌절한 일이 앞으로 여러 번 있겠지만 해결된다면 가장 좋은 마음이 있을 것 같다는 이번 교훈을 떠올리며 극복하고 싶다.
Reference
이 문제에 관하여(검증 부족으로 인한 오류 해결 ~ Active Storage를 사용하여 이미지 투고 기능을 설치하는 동안 발생합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Nayuta_ichino/items/ed5cca71b403c74dc0ec텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)