【问题标题】:How to respond with a stylesheet from your Rails controller?如何使用 Rails 控制器中的样式表进行响应?
【发布时间】:2019-03-07 12:03:26
【问题描述】:

我有一个带有一组有限中间件的 Rails 5.2.0 api app。从我想向请求它的浏览器提供 css 文件的应用程序。

css 文件的内容取决于请求参数,因此我希望能够从控制器提供文件。我已经用脚本成功地做到了这一点。这是我的实现:

Rails.application.routes.draw do
  get "assets/script"     => "assets#script"
  get "assets/stylesheet" => "assets#stylesheet", :format => :css
end

class AssetsController < ApplicationController

  ## This action works
  def script
    js = ActionController::Base.render(
      "assets/script", assigns: {foo: params[:foo]}
    )
    render :js => js
  end

  ## This action doesn't work
  def stylesheet
    css = ActionController::Base.render(
      "assets/stylesheet", assigns: {foo: params[:foo]}
    )
    render :plain => css
  end
end

当浏览器请求脚本时,它在浏览器中变为可用:

<script>$.getScript("https://example.com/assets/script");</script>

但是,我的样式表并非如此:

$('<link/>', {
  rel: 'stylesheet',
  href: "https://example.com/assets/stylesheet.css"
}).appendTo('head');

样式表被返回并添加到浏览器中,但没有投入使用。我可以从常规 Rails 应用程序的 /public 文件夹中提供完全相同的内容,并且可以使用它。

我一定遗漏了一些东西,也许是一些响应标头。知道我错过了什么吗?

【问题讨论】:

    标签: css ruby-on-rails controller


    【解决方案1】:

    浏览器期望 css 提供相应的内容类型:

    render body: css, content_type: 'text/css'
    

    Rails 有默认的 mime 类型:render css: css

    你也可以一步渲染:

    render template: "assets/stylesheet", formats: [:css], assigns: {foo: params[:foo]}
    

    【讨论】:

    • 非常感谢。我无法得到你的答案,但它让我走上了正轨。我让它与render body: css, content_type: 'text/css'一起工作。能否请您更新您的答案,然后我会奖励积分。
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 2014-07-11
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多