【发布时间】:2020-11-09 17:30:24
【问题描述】:
有很多类似的问题,但没有一个对我有用。
我在 Windows 10 上运行 Rails 6.0.3.2、Ruby 2.6.6 和 SQLite3版本 2004 (19041.388)。我按照 Rails 官方网站上的Getting Started guide 安装了 Ruby on Rails,一切都应该是最新的。
我可以正常删除文件,而且我是用管理员帐户登录的——不是必须的。
我是 Ruby 和 Rails 的新手,希望能提供详细的答案。
代码
以下是导致错误的原因:
def destroy
book = Book.find(params[:id])
begin
File.open(book.cover_url, 'w') do |f|
File.delete(f)
end
rescue Errno::ENOENT
end
book.destroy
redirect_to books_path
end
这是做什么的,它首先删除一本书的封面图片,然后从数据库中删除这本书本身。
错误
错误画面:
如果图片无法加载,以下是错误消息:
Errno::EACCES in BooksController#destroy
Permission denied @ apply2files - D:/Projects/Web/RoR/ecommerce/app/assets/images/covers/circles_scaling_anim_positioning.png
File.delete(f) 是罪魁祸首。
尝试的解决方案
-
对于 Windows,我能找到的唯一可行的答案是 this, 它主张添加一个“lib”gem,但它根本不起作用。
-
我也尝试将文件模式从“w”更改为“wb+”,但没有 也可以工作。
-
编辑 2: 根据 Dave Newton 在 cmets 中的建议(如果他是这个意思),我将图像存储目录移到了“app”文件夹之外;到“公共/上传/封面”。也没有用。
-
编辑 3: 我将删除代码完全复制到另一个目录中的新脚本中,并在示例文件上进行了尝试。我得到了同样的错误。换句话说,问题不在于 Rails,而在于 Ruby(或我的操作系统)。
-
我在终端上的文件上调用了
rm,效果很好,所以我不知道这是否是文件权限问题。
编辑:我检查了有问题的文件,虽然它仍然存在,但它现在是 0 字节大,所以我认为它已被空数据覆盖。但是,应该在 destroy 上执行的其余代码(即数据库中对象的销毁)似乎没有运行,因为该对象仍在其中。
【问题讨论】:
-
你是如何运行它的?请注意,您应该不从应用本身删除文件应用内:出于各种原因,文件应存储在应用外部。
-
@DaveNewton 我不太清楚你的问题是什么意思?至于存储:我不知道。我可以使用不同的目录没问题,但是当我将它托管到 Heroku(也是新的)时呢?那里除了根文件夹之外还有其他东西吗?我构建这个项目只是为了练习,所以我不需要 S3 存储或类似的东西。
-
@DaveNewton “请注意,您不应从应用程序本身删除应用程序内的文件:出于各种原因,文件应存储在应用程序外部。” ——等等,你的意思是“app”目录吗?我记得我为上传文件而复制的代码将它们保存在“公共”文件夹中。
-
我的意思是“你是如何运行它的”。通常,网络应用程序没有能力(或理由)删除其自身层次结构中的文件。
-
@DaveNewton 这一切都来自开发版本(或任何你称之为 development.rb 的东西)。我想做的是列出“待售”书籍,每本书都有封面。我将这些封面图片保存在
assets/images/covers/中,并在图书对象被销毁时尝试删除它们。
标签: ruby-on-rails ruby windows io ruby-on-rails-6