【问题标题】:Trying to delete carrierwave folder试图删除carrierwave文件夹
【发布时间】:2014-06-09 21:10:10
【问题描述】:

导轨 4.1 红宝石 2 视窗 8.1

CarrierWave 不会清理空目录。我试图通过在我的模型中执行以下操作来解决这个问题。

agent.rb:

after_destroy :remove_id_directory

def remove_id_directory
  if @agent.avatar
    folder_path = File.join(Cw_storage_folder, 'agent', 'avatar', @agent.id)
    FileUtils.rm_rf(folder_path)
  end
end

来自agents_controller.rb

def destroy
  @agent.destroy
  respond_to do |format|
    format.html { redirect_to agent_url }
    format.json { head :no_content }
  end
end     

当我删除一条记录时,我收到以下错误消息:

undefined method `avatar' for nil:NilClass

它指向remove_id_directory中的第一行:

if @agent.avatar

并且该记录没有从数据库中删除。如果我删除此方法和 after_destroy 调用,则会删除图像,从数据库中删除记录,但文件夹仍保留在那里。有任何想法吗?

可能的解决方案:

这行得通:

  after_destroy :remove_cw_id_directory

  def remove_cw_id_directory
    FileUtils.rm_rf(File.join(Cw_storage_folder, 'agent', 'agent', self.id.to_s)) if self.avatar
  end

【问题讨论】:

  • 你在哪里初始化@agent?发布该代码。
  • 你是说控制器的销毁方法?我现在发布了
  • 你有没有像set_agent 这样的before_filter 方法实际上设置@agent 这样的@agent = Agent.find(params[:id])
  • 我从控制器的 INDEX 方法得到了这一点。删除链接是: 并且代理是@agents.each do |agent| 的产物。如果 after_destroy 没有被调用,销毁工作正常
  • 我猜在destroying the record 之后不会有id。所以@agent 将是nil。错误也是如此。

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


【解决方案1】:

您的问题是您没有在代理模型上实例化任何 @agent 变量。如果要获取记录属性,则需要改用self。 因此,将您的 remove_id_directory 方法更改为如下所示:

def remove_id_directory
    FileUtils.rm_rf(File.join(Cw_storage_folder, 'agent', 'avatar', self.id)) if self.avatar
end

【讨论】:

  • 查看我的编辑。这也不起作用。另请注意,在我的情况下,id是一个整数,所以self.id会产生错误,它应该是self.id.to_s,仍然不起作用但它不会产生错误
  • 好的,你能告诉我Images_upload_folder的内容吗?
  • 阅读我的编辑。这是一个空文件夹。如 cw/agent/1、cw/agent/2 等,在删除之前,它们曾经有图像文件
  • 跟我问的不太一样。你能发布File.join(Images_upload_folder, 'agent', 'agent')的输出吗?
  • 我遇到了语法错误。您的解决方案有效。我尝试的其他解决方案也是如此。我使用的是 Image_upload_folder 常量,而我应该使用的是 Cw_images_folder 常量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多