【问题标题】:Rails ActiveStorage url_for returns an URL which is not validRails ActiveStorage url_for 返回一个无效的 URL
【发布时间】:2019-03-04 19:36:03
【问题描述】:

我有一个带有 Avatar 的 Employee 模型。我可以将图像附加到头像,但每当我尝试显示图像时,

url_for(@employee.avatar)

产生一个死链接。我所看到的只是标签中 alt 属性的值。我得到的图像标签如下

<img src="/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--4786aa4d9d82d8f8d572b857965088b20fcb2f49/Portrait.jpg" 
alt="Thumbnail">

而且我知道图片已正确附加。当我调用以下命令时,我得到了这个结果:

@employee.avatar
=> #<ActiveStorage::Attached::One:0x00007ff7e9ba41c0 @name="avatar",
@record=#<Employee id: 4, first_name: "Meda", last_name: "Burgdorf",  
created_at: "2019-03-03 23:03:00", updated_at: "2019-03-03 23:17:56">, 
@dependent=:purge_later> 

我可以在存储目录中看到图像

非常感谢您的帮助。谁能帮我显示保存的图像。

这是我的设置。

class Employee < ApplicationRecord
   has_one_attached :avatar
   ...
end

我的 storage.yml 文件的内容

local:
   service: Disk
   root: <%= Rails.root.join("storage") %>

我的 Active Storage 迁移已迁移。查看我的 schema.rb 文件

ActiveRecord::Schema.define(version: 2019_03_03_211537) do

  create_table "active_storage_attachments", force: :cascade do |t|
    t.string "name", null: false
    t.string "record_type", null: false
    t.integer "record_id", null: false
    t.integer "blob_id", null: false
    t.datetime "created_at", null: false
    t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
    t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
  end

  create_table "active_storage_blobs", force: :cascade do |t|
    t.string "key", null: false
    t.string "filename", null: false
    t.string "content_type"
    t.text "metadata"
    t.bigint "byte_size", null: false
    t.string "checksum", null: false
    t.datetime "created_at", null: false
    t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
  end

【问题讨论】:

  • Started GET "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--76027e62bac321f7684b895d630ad9ecae8af821/CROPPED-Eva_Lottery.jpg" for 127.0.0.1 at 2019-03-04 22:52:51 +0100 据我了解没有错误。
  • @muistooshort:我发现了错误,虽然我不太明白为什么这会破坏解决方案!在我的 routes.rb 一直到最后我有#get '*path' =&gt; redirect('/') 它捕获了所有未知的路线并将其路由回根。通过删除这条线,我现在可以看到图像了。

标签: ruby-on-rails rails-activestorage


【解决方案1】:

由于 Active Storage 将路由附加到主路由文件中,因此它们会在您捕获所有路由之后出现。更好的是,您可以逃脱活动的存储路线,例如

get '*path', to: redirect('/'), constraints: lambda { |req|
  req.path.exclude? 'rails/active_storage'
}

【讨论】:

  • 我们在哪个文件中添加这个以及在哪里?
  • 这将被添加到 config 文件夹下的 routes.rb 文件中。这也将添加到文件的末尾。
  • 这是一个很好的 hack,但不幸的是,对于带有该前缀的任何东西,都会出现无法修复的路由错误。例如,www.example.com/rails/active_storage/404 - 应用中断、未处理的路由错误。
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多