2

的Rails 4.1 红宝石2级 的Windows 8.1试图删除文件夹carrierwave

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 
+0

你在哪里初始化'@ agent'?发布该代码。 – Pavan

+0

你的意思是控制器的销毁方法?我现在发布了 – EastsideDeveloper

+0

你有没有像'set_agent'这样的'before_filter'方法,可以像'@agent = Agent.find(params [:id])那样实际设置'@ agent'? – Pavan

回答

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 
+0

请参阅我的编辑。这也不起作用。另外请注意,在我的情况下,id是一个整数,所以self.id会产生一个错误,它应该是self.id.to_s,仍然不起作用,但它不会产生错误 – EastsideDeveloper

+0

好吧,你能告诉我Images_upload_folder的内容? – Almaron

+0

阅读我的编辑。这是一个空文件夹。正如在cw/agent/1,cw/agent/2等等在删除之前,他们曾经有过映像文件 – EastsideDeveloper