Как ответить с помощью таблицы стилей из вашего контроллера Rails? - PullRequest
1 голос
/ 07 марта 2019

У меня есть приложение Rails 5.2.0 api с ограниченным набором промежуточного программного обеспечения.Из приложения я хочу передать файл 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');

Таблица стилей возвращается и добавляется в браузер, но не используется.Я могу подавать точно такой же контент из папки /public обычного приложения Rails, и он будет задействован.

Я должен что-то упустить, может быть, некоторые заголовки ответа.Есть идеи, что мне не хватает?

1 Ответ

0 голосов
/ 11 марта 2019

Браузеры ожидают, что css будет обслуживаться соответствующим типом контента:

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

В Rails по умолчанию установлен тип mime для этого: render css: css

Также вы можете выполнить рендеринг за один шаг:

render template: "assets/stylesheet", formats: [:css], assigns: {foo: params[:foo]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...