Метод очистки Active Storage выдает неопределенный метод Sign_id для NilClass - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть проблема, похожая на вопрос здесь, но удаление базы данных не является жизнеспособным решением для моего проекта: Rails 5.2 Неопределенный метод ActiveStorage `Sign_id 'для nil: NilClass

У меня есть форма, которая позволяет загружать новые изображения и удалять уже загруженные изображения, нажав на ссылку. Форма использует Ruby on Rails Active Storage и S3. Я следовал за ответом здесь , чтобы создать ссылку, по которой пользователи могут щелкнуть, чтобы удалить изображение. Я думаю, что это удаление изображения. Однако, когда страница перезагружается, я получаю эту ошибку

enter image description here Ошибка: Невозможно преобразовать изображение в URL: неопределенный метод подписанный идентификатор для nil: NilClass

После нажатия на ссылку «Удалить», страница должна перезагрузиться и показать оставшиеся изображения. Как мне устранить эту ошибку?

Вот модель

class Space < ApplicationRecord
  belongs_to :user

  has_many_attached :space_image

end

Контроллер

class SpacesController < ApplicationController
  before_action :set_space, except: [:index, :new, :create, :delete_image_attachment]
  before_action :authenticate_user!, except: [:show]


  def delete_image_attachment
    @space_image = ActiveStorage::Blob.find_signed(params[:id])
    @space_image.purge_later
    redirect_back(fallback_location: spaces_path)
  end


  private
    def set_space
      @space = Space.find(params[:id])
    end
end

Вид

<div>
  <% if @space.space_image.attached? %>
    <% @space.space_image.each do |space_image| %>
    <%= image_tag space_image, class: "avatar-medium" %>
    <%= link_to 'Remove', delete_image_attachment_space_url(space_image.signed_id),
                method: :delete,
                  data: { confirm: 'Are you sure?' } %>
    <% end %>
  <% end %>
</div>

** Ошибка вывода сервера **

ActionView::Template::Error (Can't resolve image into URL: undefined method `signed_id' for nil:NilClass):
    1: <div>
    2:   <% if @space.space_image.attached? %>
    3:     <% @space.space_image.each do |space_image| %>
    4:     <%= image_tag space_image, class: "avatar-medium" %>
    5:     <%= link_to 'Remove', delete_image_attachment_space_url(space_image.signed_id),
    6:                 method: :delete,
    7:                   data: { confirm: 'Are you sure?' } %>

app/views/spaces/_spaceimg.html.erb:4:in `block in _app_views_spaces__spaceimg_html_erb___4211978368865358240_70218939472720'
app/views/spaces/_spaceimg.html.erb:3:in `_app_views_spaces__spaceimg_html_erb___4211978368865358240_70218939472720'
app/views/spaces/listing.html.erb:121:in `block in _app_views_spaces_listing_html_erb__2591928334825339114_70218934956920'
app/views/spaces/listing.html.erb:15:in `_app_views_spaces_listing_html_erb__2591928334825339114_70218934956920'

1 Ответ

0 голосов
/ 04 сентября 2018

Это происходит потому, что вы удалили запись непосредственно из ActiveStorage :: Blob , таким образом, вы нарушили последовательность.

Вместо этого вы должны найти соответствующую запись в ActiveStorage :: Attachment , а затем удалить ее: см. эту строку .


Редактировать: Один из примеров того, как удалить вложение.

Протестировано в консоли, поэтому, возможно, вам нужно исправить синтаксис.

space_image.id должен вернуть идентификатор записи в ActiveStorage :: Attachment, поэтому передайте его контроллеру:

delete_image_attachment_space_url(space_image.id)

Затем в контроллере просто найдите запись и примените метод, необходимый для ее удаления:

  def delete_image_attachment
    @space_image = ActiveStorage::Attachment.find(params[:id])
    @space_image.purge
    # whatever
  end
...