首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

活动存储has_many_attached正在清除以前的上载

has_many_attached 是 Rails 6 中引入的一个新功能,它允许你在一个模型中关联多个文件附件。如果你发现 has_many_attached 正在清除以前的上传文件,可能是由于以下几个原因:

1. 模型定义问题

确保你在模型中正确地定义了 has_many_attached

代码语言:javascript
复制
class User < ApplicationRecord
  has_many_attached :photos
end

2. 保存操作问题

当你保存模型实例时,Rails 会自动处理附件的保存。如果你手动设置了附件,可能会导致之前的文件被清除。

代码语言:javascript
复制
user = User.new
user.photos.attach(io: File.open('/path/to/file'), filename: 'file.jpg')
user.save

3. 更新操作问题

在更新模型实例时,如果你重新赋值附件,之前的文件可能会被清除。

代码语言:javascript
复制
user = User.find(1)
user.photos.attach(io: File.open('/path/to/new_file'), filename: 'new_file.jpg')
user.save

4. 数据库迁移问题

确保你的数据库迁移文件正确地设置了 has_many_attached

代码语言:javascript
复制
class AddPhotosToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :photos, :jsonb, default: {}, null: false
  end
end

5. ActiveStorage 配置问题

确保你的 config/storage.yml 文件正确配置了存储后端(如本地文件系统、Amazon S3 等)。

代码语言:javascript
复制
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

6. 调试信息

如果你仍然遇到问题,可以添加一些调试信息来查看具体发生了什么。

代码语言:javascript
复制
user = User.find(1)
puts user.photos.attachments.inspect

示例代码

以下是一个完整的示例,展示了如何正确使用 has_many_attached

代码语言:javascript
复制
# 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
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 领券