从 Rails 6 中删除 ActiveStorage 路由

Posted

技术标签:

【中文标题】从 Rails 6 中删除 ActiveStorage 路由【英文标题】:Remove ActiveStorage routes from Rails 6 【发布时间】:2020-01-16 16:00:41 【问题描述】:

我从 config/application.rb 中删除了 ActionStorage,但是当我运行 rake routes | less 时,我看到了这些路由。

我的/config/routes.rb 上没有任何设置...

                   Prefix Verb URI Pattern                                                                              Controller#Action
       rails_service_blob GET  /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET  /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET  /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT  /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

有人知道我可以如何删除这些吗?

【问题讨论】:

【参考方案1】:

从现有 Rails 应用程序中删除 ActiveStorage 路由需要进行两项更改:

首先,在config/application.rb 中,注释掉active_storage/engineaction_text/engine

require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
# require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
# require "action_text/engine"
require "action_cable/engine"
require "rails/test_unit/railtie"

然后,在每个environment 配置文件中(例如config/development.rb),注释掉config.active_storage.service

# Store uploaded files on the local file system (see config/storage.yml for options).
# config.active_storage.service = :local

这将删除 ActiveStorage 路由:

$ rails routes
You don't have any routes defined!

Please add some routes in config/routes.rb.

For more information about routes, see the Rails guide: https://guides.rubyonrails.org/routing.html.

【讨论】:

在 Rails 6 中,我还需要评论 require 'action_mailbox/engine' 以删除这些路线。 无法理解,为什么 Rails 默认会注入这些路由。有人可能想上传文件,没有这些路线。应该有一种方法,可以在不移除所有引擎的情况下移除路线。【参考方案2】:

在您的 application.rb 配置文件 https://github.com/rails/rails/blob/439d4995c1dab475b576fcb19ea95ae37e0ed222/guides/source/configuring.md#configuring-active-storage 上将 draw_routes 配置设置为 false

config.active_storage.draw_routes = false

编辑:截至目前,当前稳定版本(6.0-stable)不支持此选项,它位于主分支上,应该可以在下一个版本中使用

【讨论】:

据我所知,该配置选项不在稳定版本上,它在主分支上,它将在下一个版本中工作,我认为你现在不能跳过这些路线破解代码(我不推荐)。【参考方案3】:

有一种“官方”方法可以做到这一点,它内置在 Rails 中。如果您使用

创建新项目
$ rails new dummy_project --skip-active-storage

您可以在新创建的 config/application.rb 中找到您需要的内容(Rails 6.0.1,但从 5.2 开始工作):

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
# require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
# require "action_mailbox/engine"
# require "action_text/engine"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
require "rails/test_unit/railtie"

用上面的sn-p替换require 'rails/all',你应该很高兴。

【讨论】:

对于现有项目,可能值得删除架构中的项目 + 任何现有的活动记录迁移【参考方案4】:

这有点愚蠢,但出于某种原因删除config/storage.yml 也摆脱了这些路线。

【讨论】:

好吧 - 我没有 config/storage.yml(应用程序从 5.0 迁移到 Rails 5.3)文件,但无论如何都会显示不需要的路由。

以上是关于从 Rails 6 中删除 ActiveStorage 路由的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4:如何从数据库中删除或删除(连接)表?

Rails 如何知道何时从 `sessions` 表中删除记录?

有没有办法在 Rails 6 中禁用动作文本的图像/附件部分?

rails:从控制器名称中删除下划线

在 rails upgrade 迁移条目从模式迁移表中删除后

如何从现有迁移文件中删除脚本 rails