the rails present not from asset application and ruby-on-rails ruby-on-rails-3.1 asset-pipeline

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?



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.