has_many_attached
是 Rails 6 中引入的一个新功能,它允许你在一个模型中关联多个文件附件。如果你发现 has_many_attached
正在清除以前的上传文件,可能是由于以下几个原因:
确保你在模型中正确地定义了 has_many_attached
:
class User < ApplicationRecord
has_many_attached :photos
end
当你保存模型实例时,Rails 会自动处理附件的保存。如果你手动设置了附件,可能会导致之前的文件被清除。
user = User.new
user.photos.attach(io: File.open('/path/to/file'), filename: 'file.jpg')
user.save
在更新模型实例时,如果你重新赋值附件,之前的文件可能会被清除。
user = User.find(1)
user.photos.attach(io: File.open('/path/to/new_file'), filename: 'new_file.jpg')
user.save
确保你的数据库迁移文件正确地设置了 has_many_attached
:
class AddPhotosToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :photos, :jsonb, default: {}, null: false
end
end
确保你的 config/storage.yml
文件正确配置了存储后端(如本地文件系统、Amazon S3 等)。
local:
service: Disk
root: <%= Rails.root.join("storage") %>
如果你仍然遇到问题,可以添加一些调试信息来查看具体发生了什么。
user = User.find(1)
puts user.photos.attachments.inspect
以下是一个完整的示例,展示了如何正确使用 has_many_attached
:
# app/models/user.rb
class User < ApplicationRecord
has_many_attached :photos
end
# db/migrate/xxxx_add_photos_to_users.rb
class AddPhotosToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :photos, :jsonb, default: {}, null: false
end
end
# config/storage.yml
local:
service: Disk
root: <%= Rails.root.join("storage") %>
# 在控制器中
def update
@user = User.find(params[:id])
if @user.update(user_params)
redirect_to @user, notice: 'User was successfully updated.'
else
render :edit
end
end
private
def user_params
params.require(:user).permit(:name, photos: [])
end
领取专属 10元无门槛券
手把手带您无忧上云