【问题标题】:Ruby On Rails [Carrierwave]: Cannot delete imageRuby On Rails [Carrierwave]:无法删除图像
【发布时间】:2025-12-18 13:25:02
【问题描述】:

我是 Rails 的新手,正在尝试使用“carrierwave-ftp”gem 将图像上传到 ftp。对于图像上传,我有两个控制器。第一个是“events_controller”,第二个是“events_pictures_controller”。

图片正在上传到 ftp。但问题是当我删除一张图片时,它正在破坏整个事件。请帮忙!

这是我的事件模型:

class Event < ActiveRecord::Base
  has_many :event_pictures, dependent: :destroy
  accepts_nested_attributes_for :event_pictures, allow_destroy: true
  validates_presence_of :name, :date
end

这是我的 EventPictures 模型:

class EventPicture < ActiveRecord::Base
  mount_uploader :picture_title, EventPicturesUploader
  validates_presence_of :picture_title
  belongs_to :event, dependent: :destroy
end

事件控制器:

def index
    @events = Event.all.order('date DESC')
end  

def show
    @event_pictures = @event.event_pictures.all
end

def new
    @event = Event.new
    @event_picture = @event.event_pictures.build
end

def edit
end

def create
    @event = Event.new(event_params)
      respond_to do |format|
        if @event.save
          params[:event_pictures]['picture_title'].each do |a|
            @event_picture = @event.event_pictures.create!(:picture_title => a, :event_id => @event.id)
          end
      format.html { redirect_to @event, notice: 'Event was successfully created.' }
        else
      format.html { render :new }
    end
  end
end

def destroy
    @event = Event.find params[:id]
    @event.destroy
    redirect_to events_url
end

private
  def set_event
      @event = Event.find(params[:id])
  end

  def event_params
      params.require(:event).permit(:name, :date, event_pictures_attributes: [:id, :event_id, :picture_title])
  end

这是 EventPictures Controller 中的 Destroy 方法

def destroy
    @event_picture = EventPicture.find params[:id]
    @event_picture.destroy
    redirect_to "events_url"
end

同时在 events.show.html.erb 中,我有这个:

<% @event_pictures.each do |p| %>    
      <%= link_to image_tag(p.picture_title_url, :class => 'event-img'), image_path(p.picture_title_url) %>
      <%= link_to 'Delete', p, method: :delete, data: { confirm: "Are you sure?" } %>
<% end %>

【问题讨论】:

  • 试试在EventPicture模型中删除dependent: :destroybelongs_to :event, dependent: :destroy

标签: ruby-on-rails ruby ruby-on-rails-4 carrierwave


【解决方案1】:

在您的EventPicture 模型中,您有dependent: :destroy 的关联,这意味着当图片也会删除相应的事件。所以只需编辑关联并使其:

belongs_to :event

而且你已经依赖于 Event 模型的销毁,所以当一个事件被删除时,相应的图片也会被删除,这是正确的。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我相信你的错误在于这一行

    belongs_to :event, dependent: :destroy
    

    这是告诉 EventPicture 模型在删除它的父模型 Event 时删除它。

    替换为

    belongs_to :event
    

    【讨论】:

    • 是的,这就是问题所在,问题已解决。非常感谢