Ruby on rails 在rails生产环境中上载文件后,文件路径不会更新
我有一个rails应用程序,当用户创建一本书时,它会将名称与图书id相同的图像上传到Ruby on rails 在rails生产环境中上载文件后,文件路径不会更新,ruby-on-rails,ruby,file-upload,passenger,Ruby On Rails,Ruby,File Upload,Passenger,我有一个rails应用程序,当用户创建一本书时,它会将名称与图书id相同的图像上传到assets/books\u icon upload_icon(params[:book][:image_upload]) # upload_image when create/update book def upload_icon(uploaded_io) photo_directory = "app/assets/images/" # only when user up
assets/books\u icon
upload_icon(params[:book][:image_upload])
# upload_image when create/update book
def upload_icon(uploaded_io)
photo_directory = "app/assets/images/"
# only when user upload the iphoto
if uploaded_io.present?
# upload to the exact location with category_id
extension = File.extname(uploaded_io.original_filename)
photo_location = 'books_image/'+ @book.id.to_s + extension
# open in binary mode
photo_full_location = photo_directory + photo_location
File.open(photo_full_location, 'wb') do |file|
file.write(uploaded_io.read)
end
# only have to state which is the directory,
# image_tag will use assets piepline which will add 'assets/images/' as prefix in src
@book.update_attribute(:image_url, photo_location)
end
end
它在开发模式下工作。然后,我在mac Apache2服务器上部署了rails应用程序,使用mysql作为数据库,并在开发配置文件中更改了config.assets.compile=true
在生产模式下,我可以创建新书,并可以将图像上载到资产/books\u图标
。但是,我刚刚上传的图像的文件路径将不会更新
例如,我创建了一本id为2的新书,在assets/books\u图标中有2.jpg。但是rails应用程序会告诉我http://localhost/assets/images/books_icon/2.jpg
已丢失
但是,当我重新启动apache服务器时,我可以在http://localhost/assets/images/books_icon/2.jpg
有没有解决这种类型的缓存问题的解决方案???在这种情况下,上载的图像实际上并不被视为“资产”——将其视为碰巧存储在其他地方的数据。(图像资源可能是徽标或背景图像等)。Rails的资产管道做了一些非常棘手的事情,以便在实际资源(如图像)是资产时解析到它的简单文件路径
默认情况下,Rails将app/public
文件夹设为文档根目录,因此您可以将图像上载到该文件夹中——可能位于名为“upload/img”的子目录中,在这种情况下,您可以使用路径/upload/img/mybook.jpg
引用它
然而,这种方法往往很脆弱,因为映像实际上与数据库中的数据直接关联,但位于服务器的文件系统上。当您从开发转移到停滞或生产服务器时,它开始崩溃
我不推荐的一种方法是上传图像并将其作为blob类型存储在数据库中。我建议的另一个方法是使用另一个“中心”服务器,您可以将图像上载到该服务器,作为数据库的扩展。许多人使用AmazonAWS“S3”服务来实现这类功能。看一看,它在使所有这些变得非常简单、灵活方面做得非常出色,而且功能强大。是否有特定要求使您决定将这些保存在应用程序/资产中而不是公共?没有要求:)这只是我的家庭作业设计:)谢谢您的回答:)我没有意识到资产
文件夹的意义。我来看看宝石:)