如何从挂载路径在 Rails 中提供静态文件

问题描述

我正在尝试开发一个在 Rails 应用程序中使用的 gem,其中包括在安装位置提供静态文件(html、js 和 css)。使用 gem 的 UI 将通过将以下内容添加config/routes.rb

来完成
mount MyGem::UI.new,at: "/foo"

我几乎可以使用 Rack::Static 进行此操作,但如果有更好的解决方案,我不会附上此解决方案。

module MyGem
  module_function

  def root
    @root ||= Pathname(__dir__).expand_path
  end
end
module MyGem
  class UI
    def call(env)
      static_app.call(env)
    end

    def static_app
      Rack::Static.new(nil,static_options)
    end

    def static_options
      {urls: [""],root: asset_path,index: 'index.html'}
    end

    def asset_path
      @root ||= MyGem.root.join("assets")
    end
  end
end

MyGem.root/assets 中的文件可以简化为单个 html 文件,使用 href="./index.css" 链接到同一位置的单个 css 文件。 (实际上,它们将是一个使用 homepage: "./" in package.json using create-react-app 构建的 React 应用程序,以生成所有资产的 ./ 相关链接。)我已经使用虚拟和完整的 React 应用程序测试了此设置。

此设置有效当且仅当我使用尾部斜杠转到 localhost:3000/foo/。但是,如果我导航到 localhost:3000/foo 而没有尾部斜杠,我会成功获得 index.html 页面,但其所有链接都已损坏,返回 404 not found:

GET http://localhost:3000/index.css net::ERR_ABORTED 404(未找到)

如何避免这种情况并在安装位置“/foo”上稳健地服务器我的静态内容?作为飞行员,只需要尾部斜杠就可以接受一半,但留在已发布的宝石中有点狡猾。

我愿意接受涉及替代 rails 路线配置、提供静态内容的不同方式(取决于是否容易被 gem 用户描述)以及构建静态内容的不同方式以及其他任何内容解决方案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)