ruby-on-rails - from - the asset is not present in the asset pipeline rails 5
¿Cómo se hace referencia a los activos compilados del controlador en Rails 3.1? (6)
Estoy usando el PDFkit en mi controlador para crear una serie de archivos PDF, comprimirlos y luego enviarlos al usuario.
Para controlar los estilos de salida, le digo a PDFKit qué hojas de estilo usar durante la generación de contenido. Necesito pasar la referencia de archivo del archivo CSS. Ya que Rails ahora está compilando y cambiando el nombre de mis hojas de estilo, no estoy seguro de cómo hacer referencia al activo CSS compilado dentro de mi controlador.
Esto es lo que solía hacer:
InvoicesController < ApplicationController
def download
kit = PDFKit.new(render_to_string(:show, :layout => false))
kit.stylesheets << "#{Sass::Plugin.options[:css_location]}/application.css"
kit.to_file("#{file_date_string}.pdf")
# snip
end
end
Sass :: Plugin.options [: css_location] ahora devuelve la ubicación incorrecta, sin mencionar el hecho de que application.css ya no es el nombre válido del archivo. Debo mencionar que tengo una aplicación / asset / application.css que sirve como un manifiesto para mis archivos SCSS, y funciona correctamente en mis vistas a través del método stylesheet_link_tag ().
Básicamente, lo que estoy buscando es un controlador equivalente de asset_path () para hacer algo como esto:
kit = PDFKit.new(render_to_string(:show, :layout => false))
kit.stylesheets << asset_path(''application.css'')
kit.to_file("#{file_date_string}.pdf")
¿Alguien puede ayudar?
Creo que stylesheet_path("application") es lo que estás buscando
La mejor manera de obtener el nombre compilado es desde el manifiesto que se genera cuando compila.
Puede crear un método de controlador que sirva al nombre sin procesar en desarrollo y luego acceda al manifiesto en producción para asignar el nombre correcto.
La ubicación del manifiesto por defecto es:
File.join(Rails.public_path, config.assets.prefix, ''manifest.yml'')
Pero parece que puedes acceder a esto como un hash en config.assets.digests
config.assets.digests[css_file_name_as_string]
Una solución es colocar el CSS en línea en su vista.
En HAML, esto podría verse como:
%style
= Sass.compile(File.read(File.join(Rails.root, ''app'', ''assets'', ''stylesheets'', ''sass'', "application.scss")))
O en ERB:
<style>
<%= Sass.compile(File.read(File.join(Rails.root, ''app'', ''assets'', ''stylesheets'', ''sass'', "application.scss"))) %>
</style>
Rails.application.assets
está mal documentado pero brinda acceso al gancho de Rails en Sprockets, como un objeto Sprockets::Environment
. Rails usa Sprockets para ejecutar básicamente todo el flujo de activos, y aquí es donde deberías conectarte para cosas como esta:
kit.stylesheets << Rails.application.assets[''application.css''].pathname
https://github.com/sstephenson/sprockets dice de esto:
Accediendo a los activos programáticamente
Puede usar el método find_asset
(con alias como []
) para recuperar un activo de un entorno Sprockets. Sprockets::BundledAsset
una ruta lógica y obtendrás una instancia de Sprockets::BundledAsset
:
environment[''application.js'']
# => #<Sprockets::BundledAsset ...>
Llame a to_s
en el activo resultante para acceder a su contenido, la length
para obtener su longitud en bytes, mtime
para consultar su hora de última modificación y la pathname
para obtener su ruta completa en el sistema de archivos.
Rails.application.assets[''application.css''].pathname
siempre devuelve la ruta original del activo sin procesar, no el archivo precompilado, por lo que la respuesta principal no me funcionó.
Sin embargo, la llamada a to_s
en el activo empaquetado en lugar de la pathname
de pathname
parece devolver correctamente el cuerpo del activo precompilado, por lo que puede usar un estilo en línea en lugar de usar kit.stylesheets <<
:
<style> <%= Rails.application.assets["application.css"].to_s %> </style>
view_context.asset_path ''application.css''
debería hacer el truco.