Как ответить таблицей стилей с вашего контроллера Rails?

У меня есть 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, и он будет использован.

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

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
3
0
541
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'. Не могли бы вы обновить свой ответ, тогда я начислю баллы.

JohnSmith1976 11.03.2019 14:05

Другие вопросы по теме