У меня есть 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 будет обслуживаться с соответствующим типом контента:
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'. Не могли бы вы обновить свой ответ, тогда я начислю баллы.