Rails Active Storage - 保留现有文件/上传吗?

2024-06-19

我有一个 Rails 模型:

has_many_attached :files

默认情况下,通过 Active Storage 上传时,如果您上传新文件,它会删除所有现有上传内容并将其替换为新文件。

我有一个控制器破解,由于多种原因,它不太理想:

Rails 6 中使用 has_many_attached 更新图像的正确方法是什么 https://stackoverflow.com/questions/59803964/what-is-the-correct-way-to-update-images-with-has-many-attached-in-rails-6

有没有办法配置 Active Storage 以保留现有的存储?


看起来有一个配置 https://guides.rubyonrails.org/configuring.html#config-active-storage-replace-on-assign-to-many正是这样做的

config.active_storage.replace_on_assign_to_many = false

不幸的是,根据当前的 Rails 源代码,它已被弃用,并且它将被弃用Rails 7.1 中删除了 https://github.com/rails/rails/blob/v7.0.2.3/activestorage/lib/active_storage/attached/model.rb#L150

config.active_storage.replace_on_assign_to_many已弃用并将在 Rails 7.1 中删除。确保您的代码可以很好地工作config.active_storage.replace_on_assign_to_many set to true升级之前。 要将新的可附加项附加到 Active Storage 关联,请优先使用attach。 使用关联设置器将导致清除现有附加附件并用新附件替换它们。

看起来像明确使用attach将是唯一的前进道路。

所以一种方法是在控制器中设置所有内容:

def update
  ...
  if model.update(model_params)
    model.files.attach(params[:model][:files]) if params.dig(:model, :files).present?
  else
    ...
  end
end

如果您不喜欢在控制器中包含此代码。例如,您可以覆盖模型的默认设置器,如下所示:

class Model < ApplicationModel
  has_many_attached :files

  def files=(attachables)
    files.attach(attachables)
  end
end

不确定我是否会建议这个解决方案。我更愿意添加新方法来附加文件:

class Model < ApplicationModel
  has_many_attached :files

  def append_files=(attachables)
    files.attach(attachables)
  end
end

并在你的表格中使用

  <%= f.file_field :append_files %>

它可能还需要模型中的阅读器,可能还需要一个更好的名称,但它应该演示这个概念。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails Active Storage - 保留现有文件/上传吗? 的相关文章

  • 检索给定用户发表评论的所有帖子,Ruby on Rails

    我有用户 帖子和评论 用户只能对每个帖子发表一条评论 class User lt ActiveRecord Base has many posts has many comments end class Post lt ActiveReco
  • 使用curl测试Rails路由

    我有一个名为 users 的模型 我想使用 API 对其进行更新 我想做到这一点的方法是创建一个更新路由并插入执行更新的代码 我使用 RSpec 创建了一个测试 它似乎有效 但是 我想实际查看数据库中更改的数据 因此我尝试使用curl 来更
  • Stripe 令牌未转移到控制器导轨 4

    问题 我已经测试了 CoffeeScript 表单调用 Stripe 使用正确的响应令牌设置隐藏字段并提交表单 我的问题是 一旦提交 控制器似乎无法正确获取令牌并抛出此错误 Stripe InvalidRequestError 您必须提供卡
  • 如何显示在 Rails 控制台中运行的 SQL 查询?

    当我运行查询时 例如MyModel where or record associated things 在控制台中 如何查看正在运行的实际数据库查询 以便更好地了解正在发生的情况 Rails 3 在控制台中输入这一行 ActiveRecor
  • 删除并重新创建单个表(在 Heroku 上)

    我的应用程序处于测试阶段 我一直在对涉及新模型的功能进行有限的测试 经过大量测试后 我必须进行结构更改 使旧数据不起作用 我需要做的只是删除并重新创建一张表 我知道我可以在迁移中做到这一点 但这看起来像是一个黑客 在本地开发副本中我只会使用
  • 让 Turbolinks 包装器与 Ruby on Rails Devise 一起使用

    对于我的应用程序 我正在尝试设置 Turbolinks Mobile 包装器 gt 我遇到了无法登录应用程序的问题 并且认为问题是我需要修改 Devise 以使其切换到 XHR 以适用于移动设备 我的登录表单使用 Devise 但我看不到代
  • 如何使用康康康舞?

    我想向我的 Rails 应用程序中的用户授予权限 我有 管理员 可以创建 更新和删除所有帖子和评论 用户 只能创建和更新自己的评论 访客 则不能执行这些操作 为此 我使用宝石 devise 和 cancancan 我理解 devise 宝石
  • Rails 从哈希数组中选择最大值

    我有一个像这样的哈希数组 我想取其中的最大值 data name abc value 10 0 name def value 15 0 name ghi value 20 0 name jkl value 50 0 name mno val
  • 过滤器链因 [:login_required] returned_or_redirected 而停止

    希望我能很好地解释这一点 但如果需要更多信息 请告诉我 我正在构建一个表单 用户可以在其中创建 事件 此次事件有如下关系 属于 客户 客户有很多事件 belongs to 用户 用户有很多事件 has one incident status
  • Capistrano RVM 和 Ubuntu RVM 不是一个函数,使用“rvm use ...”选择 rubies 将不起作用

    我第一次尝试在 ubuntu 服务器上部署我的应用程序 我一直遇到这个错误 2013 03 24 15 13 36 executing deploy run migrations executing rvm gemset use vapin
  • 运行“bundle install”失败并要求我运行“bundle install”

    事实上 当从我从 git 存储库克隆的现有 Rails 应用程序内部运行时 所有与 gem 相关的命令都会导致相同的错误消息 bundle install Could not find tzinfo 0 3 27 in any of the
  • Rails 可安装引擎的 prepend_view_path

    一方面 我有一个可安装的发动机 比如说前轮 前面包含我的资产和几页 它与 MainApp 隔离 我不想让它触及主应用程序 另一方面 我希望我的 MainApp 使用布局和部分前端 所以我这样设置布局 class ApplicationCon
  • Rails cron 每当捆绑:命令未找到

    我尝试使用 每当 每天执行一次耙子任务 我收到这个错误 bin bash bundle command not found home app rvm rubies ruby 1 9 2 p180 lib ruby site ruby 1 9
  • Friendly_id 和真实ID

    有什么办法可以得到真正的id使用Friendly id 修改的模型中的列 出于性能原因 我不想对其进行另一个数据库查询 广义上来说Friendly id修改to param and find方法 接下来应该可以工作 affiche Affi
  • jruby-openssl 中已初始化常量

    当在 Torquebox 上运行我的 Rails 应用程序时 我得到了很多 already initialized constant 警告源自gems jruby openssl 0 8 2 lib shared jruby openssl
  • 在 Rails 中从注册表单创建 Devise 用户时如何创建另一个对象?

    我的系统中有不同类型的用户 比方说 其中一种是设计师 class Designer lt ActiveRecord Base attr accessible user id portfolio id some designer specif
  • 覆盖生产环境中的后端资产

    我正在开发一个需要稍微改变 Refinery 的 WYMEditor 行为的项目 这可以通过重写轻松完成jquery refinery wymeditor js using rake refinery override并根据我自己的需要进行
  • 设计没有路由与指定删除的链接中的 [GET]“/users/sign_out”匹配

    因此 我四处寻找解决此问题的方法 大多数人似乎都说了同样的话 但对解决我的问题没有多大作用 我已在链接中指定了删除方法 但路由错误表明这是一个 GET 请求 知道为什么下面的链接最终会覆盖 忽略方法声明吗 Routes devise for
  • ActiveStorage::FileNotFoundError 但文件确实存在

    我正在开发这个 Rails 6 0 21 应用程序 ruby 2 5 5 并使用 puma 3 12 2 作为开发 Web 服务器和具有本地磁盘服务的 ActiveStorage 我的应用程序时不时地出错ActiveStorage File
  • 如何防止Rails“复数”列名?

    我正在使用 dwilkie 的外国人 http github com dwilkie foreignerRails 插件 我有一个表创建语句 如下所示 create table agents games force gt true id g

随机推荐

  • Excel 接受一些字符,而 OpenXml 有错误

    我有一个字符串 我想使用 C 中的 openxml 组件将其导出到 Excel 文件 我的文本有 u001f 字符 而 openxml 对此字符有错误 错误文本 十六进制值 0x1f 是无效字符 我将该测试直接复制到 Excel 中 没有问
  • 部分预处理 C 或 C++ 源文件?

    有没有办法部分预处理C或者C 源文件 我所说的 部分预处理 是指扩展一些但不是全部的 include 指令 例如 我想扩展 includes 指向我的项目标头 但不扩展 includes 指向其他库的标头 我尝试通过运行来做到这一点gcc
  • Electron webContentsexecuteJavaScript:无法在 loadURL 上第二个执行脚本

    我正在测试 Electron 特别是使用executeJavaScript 我的项目使用 POST 请求登录网站 然后执行一些工作并使用同一会话加载第二个 URL 在第二个 URL 中 我需要执行 JS 但我不确定我做错了什么 在此示例中
  • 需要按天分割日期时间范围

    我有一个需要根据日期时间拆分的表 输入表 ID Start End A 2019 03 04 23 18 04 2019 03 04 23 21 25 A 2019 03 04 23 45 05 2019 03 05 00 15 14 所需
  • 在哪里实现 Swift 协议?

    在 Swift 中实现协议一致性时 我有两个选择 具有相同的最终结果 在类中实现协议 也就是说 在类定义的顶部声明一致性 并将实现放在类体内 或者 在扩展中实现协议 也就是说 完全在类之外编写符合协议的代码 这是一个例子 public cl
  • 如何定义与更高类型类型(类型构造函数)绑定的上下文

    我尝试过以下方法 def test Option T Ordering value1 Option T value2 Option T val e implicitly Ordering Option T compare value1 va
  • 在 Delphi 中的 SOAP 标头中发送简单字符串

    我需要发送这样的东西
  • 为什么这个符号链接创建了两个实例

    我有一个用于我的点文件的安装脚本 我用来创建一个目录到我的主文件夹的符号链接 这些链接执行得很好 但创建了第二个符号链接 我无法解释为什么 项目中的文件夹结构如下所示 install sh scripts shell sh shell in
  • AWS ELB 和 GoDaddy 域正在运行

    我已在 goDaddy com 中注册了一个域 并希望将流量发送到 AWS Route53 我创建了一个 ELB 我执行了以下步骤 在 Route 53 中 为我的 godaddy 域名创建一个托管区域 这反过来又为我提供了一条包含 4 个
  • 找不到 OAuth2 参数

    我正在尝试使用 OAuth 2 0 来授权 google docs API 根据谷歌给出的例子https developers google com google apps documents list authorizing reques
  • Python Scrapy:“runspider”和“crawl”命令有什么区别?

    有人可以解释一下两者之间的区别吗运行蜘蛛 and crawl命令 应该在什么情况下使用它们 在命令中 scrapy crawl options
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • Matplotlib xlabel Arial 格式,其中一个单词为斜体

    我想创建一个 matplotlib 图形 其 x 轴标签采用 Arial 字体 并且有一个斜体字 我可以用乳胶字体创建带有 x 轴标签的图形 其中一个单词为斜体 我还可以在 Arial 中创建带有 x 轴标签的图形 只要我将整个标签设置为斜
  • pyplot 中的等宽绘图大小,同时保持纵横比相等

    我想让两个图具有相同的宽度 但是生成的代码缩小了 imshow 图 xx np linspace 0 0 255 5 512 yy np linspace 0 0 255 5 512 Func np random rand len xx l
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 为什么我需要 Nginx 和 Puma?

    我正在将 Rails 应用程序部署到生产环境中 看起来 Puma 速度很快 可以处理我想要在网络服务器中完成的许多事情 我想知道我是否需要使用 Nginx 如果只使用 Puma 我会错过什么 Nginx 是一个 Web 服务器 puma 是
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • IntelliJ可以自动创建装饰器类吗?

    有时 我创建一个像这样的装饰器类 class MyInterfaceDecorator implements MyInterface private final MyInterface delegate constructor taking
  • 使用多线程使用rabbitmq消息队列(Python Kombu)

    我有一个带有单个队列的 RabbitMQ 交换 我希望创建一个运行多个线程并尽快通过该队列工作的守护进程 工作 涉及与外部服务的通信 因此每个消费者内部都会发生相当多的阻塞 因此 我希望有多个线程都处理来自同一队列的消息 我可以通过在主线程
  • Rails Active Storage - 保留现有文件/上传吗?

    我有一个 Rails 模型 has many attached files 默认情况下 通过 Active Storage 上传时 如果您上传新文件 它会删除所有现有上传内容并将其替换为新文件 我有一个控制器破解 由于多种原因 它不太理想