ActiveStorageでの画像/ PDFのアップロードに問題があります。画像は問題なくアップロードされているように見えますが、表示しようとするとエラーが発生します。
私のblog
モデルhas_one_attached
:image
およびhas_one_attached
:pdf
。アップロードは以前は機能していましたが(ActiveStorageがインストールされ、Amazon s3が正しくセットアップされていることがわかります)、問題が発生しました。
唯一の複雑な点は、PDFかどうか(すべてのブログにPDFがあるわけではありません...すべてに画像があるはずです)がある場合に機能する必要があることです。
私のblog#create
メソッドは次のとおりです。
def create
@blog = Blog.new(blog_params)
@blog.user_id = current_user.id
if @blog.published
@blog.published_on = DateTime.current
end
respond_to do |format|
if @blog.save
if @blog.image.attached?
@blog.image.purge
end
@blog.image.attach(params[:image])
if @blog.pdf.attached?
@blog.pdf.purge
end
@blog.pdf.attach(params[:pdf])
format.html { redirect_to @blog, notice: 'Blog was successfully created.' }
format.json { render :show, status: :created, location: @blog }
else
format.html { render :new }
format.json { render json: @blog.errors, status: :unprocessable_entity }
end
end
end
私のblog#update
メソッドは次のとおりです。
def update
if @blog.published
@blog.published_on = DateTime.current
end
if @blog.image.attached?
@blog.image.purge
end
@blog.image.attach(params[:image])
if @blog.pdf.attached?
@blog.pdf.purge
end
@blog.pdf.attach(params[:pdf])
respond_to do |format|
if @blog.update(blog_params)
format.html { redirect_to @blog, notice: 'Blog was successfully updated.' }
format.json { render :show, status: :ok, location: @blog }
else
format.html { render :edit }
format.json { render json: @blog.errors, status: :unprocessable_entity }
end
end
end
私のフォームは単純です:
<%= simple_form_for(@blog) do |f| %>
<%= f.error_notification %>
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
...
<div class="form-group">
<%= f.label "Blog Image" %><br />
<%= f.file_field :image %>
</div>
<div class="form-group">
<%= f.label "Linked PDF" %><br />
<%= f.file_field :pdf %>
</div>
...
<div class="form-actions text-center">
<%= f.button :submit, class: "btn-outline-primary" %>
</div>
<% end %>
私はこのようにブログに画像を表示しようとしています:
<div class="frame" style="background-image: url(<%= Rails_blob_url(@blog.image) %>)"></div>
そしてPDFこのように:
<h2 class="cta text-center"><%= link_to @blog.cta, Rails_blob_url(@blog.pdf), target: "_blank" %></h2>
私が得ているエラーは、画像がsigned_id delegated to attachment, but attachment is nil
ページの背景画像として呼び出されている場所のblog#show
です。役立つ場合は、localhost
とHerokuで同じエラーが発生します。
最後に、 この質問 でこのエラーを確認し、データベースを削除して再作成しようとしましたが、役に立ちませんでした。
誰もがここで間違って起こっているのかを見ることができますか?
私はちょうどこのエラーに遭遇し、何が起こっているのかを理解するのに本当に苦労しました。フォームを送信したときに最初に表示され、添付ファイルは含まれていませんでした。何かが本当に添付されているかどうかを確認し、その可能性に対処する必要があることがわかりました。
おそらく、@ blog.pdf.attach(params [:pdf])をblog#createのrespond_toの前に移動してみてください
次に、画像を表示しようとすると、次のようなものを試すことができます
<% if blog.pdf.attached? == false %>
<p>No pdf attached</p>
<% elsif blog.pdf.previewable? %>
<%= link_to(image_tag(blog.pdf.preview(resize: "50x50>")), Rails_blob_path(blog.pdf, disposition: "attachment"))
%>
<% elsif blog.pdf.variable? %>
<%= link_to(image_tag(blog.pdf.variant(resize: "50x50")), Rails_blob_path(blog.pdf, disposition: "attachment"))%>
<% else %>
<%= link_to "Download file", Rails_blob_path(@blog.pdf, disposition: "attachment") %>
<% end %>
Herokuには、 アクティブストレージはこちら に関する優れた記事があります。