Rails 5.2 的 ActiveStorage 图像上传错误:signed_id 已委托给附件,但附件为零
ActiveStorage Image Upload Error with Rails 5.2: signed_id delegated to attachment, but attachment is nil
我在 image/pdf 使用 ActiveStorage 上传时遇到问题。图片上传似乎没有问题,但当我尝试显示它们时却出现错误。
我的 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 上遇到了同样的错误,如果有帮助的话。
最后,我在 this question 上看到了这个错误,并尝试删除并重新创建我的数据库,但无济于事。
谁能看出这里出了什么问题?
我只是 运行 遇到了这个错误,真的很难弄清楚可能发生了什么。它第一次出现是在我提交表格但没有包含附件时。事实证明我需要检查是否真的附加了某些东西并处理这种可能性。
也许尝试将@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 在 active storage here 上有一篇很好的文章可能也有帮助。
我在 image/pdf 使用 ActiveStorage 上传时遇到问题。图片上传似乎没有问题,但当我尝试显示它们时却出现错误。
我的 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 上遇到了同样的错误,如果有帮助的话。
最后,我在 this question 上看到了这个错误,并尝试删除并重新创建我的数据库,但无济于事。
谁能看出这里出了什么问题?
我只是 运行 遇到了这个错误,真的很难弄清楚可能发生了什么。它第一次出现是在我提交表格但没有包含附件时。事实证明我需要检查是否真的附加了某些东西并处理这种可能性。
也许尝试将@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 在 active storage here 上有一篇很好的文章可能也有帮助。