【问题标题】:Serve a file from public in a controller action在控制器操作中从公共提供文件
【发布时间】:2015-02-12 17:42:50
【问题描述】:

在我的项目中,我们有一个单页应用程序,我们的构建过程将应用程序编译成一个位于public/index.html 的静态文件。

单页应用负责处理应用内的所有路由,所以无论你访问site.com还是site.com/foo/bar/action还是site.com/☃,我都希望Rails应用服务public/index.html

我有这条路线:

match '*path', to: 'foo#index', via: :all

在 FooController 中:

class FooController < ApplicationController
  def index
    render 'index.html', layout: false
  end
end

这并不像我希望的那样工作;我收到错误Missing template foo/index.html, application/index.html

是否可以在 Rails 控制器操作中提供来自 public 的资产?

【问题讨论】:

    标签: ruby-on-rails-4 asset-pipeline


    【解决方案1】:

    在 Rails 5 中,我通过这样做来实现这一点

    render file: "public/examplename.html", layout: false
    

    【讨论】:

      【解决方案2】:

      这比我想象的要容易得多。

      我变了:

      render 'index.html', layout: false
      

      render 'public/index.html', layout: false
      

      一切都按预期进行。

      【讨论】:

        【解决方案3】:

        这似乎已经改变。我正在尝试为我的应用程序的管理部分临时呈现一个静态文件,这将是一个通过 API 与 rails 对话的 VueJS SPA。我必须执行以下操作:

        routes.rb

          match '*path', :to => 'console#index', :constraints => { :subdomain=>'console'}, :via=>:all
        

        console_controller.rb

        class ConsoleController < ApplicationController
          def index
            render :file=>'/public/console/index.html', :layout=>false
          end
        end
        

        所以在路径上使用 :file 而不是没有参数 - 因为否则 Rails 5 试图将其视为普通视图模板。

        使用该路径匹配和子域,这似乎运作良好,因为所有路由都将通过 VueJS 路由器。

        【讨论】:

          猜你喜欢
          • 2018-08-21
          • 2013-06-01
          • 2013-05-15
          • 2016-08-22
          • 2021-02-28
          • 1970-01-01
          相关资源
          最近更新 更多