ruby on rails - present - Los ayudantes de sass-rails "image-url", "asset-url" no funcionan en los carriles 3.2.1
sass ruby on rails (9)
Estoy en 3.2.1, con sass-rails-3.2.4 y sass-3.1.15 ...
La documentación para el inventario de activos dice:
asset-url("rails.png", image) becomes url(/assets/rails.png)
image-url("rails.png") becomes url(/assets/rails.png)
...
Así que hice el siguiente archivo:
# app/assets/stylesheets/public/omg.css.sass
body
background: asset-url(''snake.gif'', image)
#lol
background: image-url(''snake.gif'')
y cuando visito localhost: 3000 / assets / public / omg.css obtengo:
body {
background: asset-url("snake.gif", image); }
#lol {
background: image-url("snake.gif"); }
... También traté de cambiar el archivo a omg.css.scss y cambié la sintaxis a:
# app/assets/stylesheets/public/omg.css.scss
body {
background: asset-url(''snake.gif'', image);
}
#lol {
background: image-url(''snake.gif'');
}
pero obtenga los mismos resultados ... ¿Alguien tiene alguna idea de por qué estos ayudantes no funcionan?
¿Ha habilitado la canalización de activos en application.rb
?
config.assets.enabled = true
Hiciste bien al configurar la extensión en tus hojas de estilo Sass en .css.scss
. Eso le permite a Rails saber analizar el archivo con Sass antes de que emita el contenido como CSS.
A pesar de lo que dice la documentación, parece que las opciones predeterminadas en Rails 3.2.6 le permiten hacer que las cosas funcionen con aún menos información de ruta en su CSS. Por ejemplo, ../app/assets/images/rails.png
es referencias en su archivo example.css.scss con algo como:
background: white url(rails.png) repeat-y;
No incluye la image-url
la image-url
o la image-url
asset-url
en su scss (hasta donde yo sé), simplemente url(your_image.png)
. Esa pequeña cantidad de documentación parece ser solo una explicación de lo que está haciendo en segundo plano.
Acabamos de tener el mismo problema y lo solucionamos al requerir explícitamente piñones en el Gemfile (aunque es una dependencia de ActionPack):
group :assets do
gem ''sprockets''
gem ''sass-rails'', ''~> 3.2.3''
# ...
end
No sé por qué, pero funciona ahora. ;-)
Cuando llegué a este problema, fue porque no había incluido el archivo css en el inventario de activos para la precompilación. Como resultado, se generaría en tiempo de ejecución. Como la gema sass-rails se encuentra comúnmente en el grupo: assets, los helpers no están disponibles cuando se generan archivos css en tiempo de ejecución.
Intente agregar la siguiente línea a su application.rb (o production.rb):
config.assets.precompile += %w( public/omg.css )
Encontré la solución en esta publicación, incluida una lista de nombres de los archivos al agregarlos al precompilador.
Es posible que desee intentar borrar / tmp / caché. Soy demasiado nuevo para Rails y Sass para saber por qué funcionó, pero me solucionó el mismo problema después de horas de búsqueda.
Por cierto, esto funcionó a pesar del hecho de que podía ver otras directivas Sass, como establecer variables y calcular con ellas, que se ejecutaban. Estoy seguro de que hay una explicación muy simple, una vez que tenga tiempo de rastrearlo.
He estado golpeando mi cabeza contra esto por días. La única solución que funcionó para mí fue la siguiente:
- Asegúrate de usar sass-rails para tu: grupo de desarrollo en tu Gemfile.
Si eso no lo soluciona, agregue lo siguiente a un nuevo archivo en config / initializers / llamado algo así como "horrible_sass_patch.rb":
begin require ''sass-rails'' rescue end if Class.const_defined? "Sass::Script::Functions" module Sass::Script::Functions # This function exists, but doesn''t automatically register declare :asset_url, [:value] declare :image_url, [:value] declare :font_url, [:value] # ... etc end end
Nota: Esto requiere que esté utilizando el mecanismo de carga Bundler "activo", es decir, su application.rb usa lo siguiente:
Bundler.require *Rails.groups(:assets => %w(development test))
... y si sus hojas de estilo están en el proveedor, asegúrese de que estén incluidas en la configuración de Sass:
if config.respond_to? :sass
config.sass.load_paths << Rails.root.join(''vendor'', ''assets'', ''stylesheets'')
end
Hice el cambio sugerido por @Ryan, así como la actualización de sass-rails:
bundle update sass-rails
sass 3.2.6 funcionó para mí, mientras que 3.2.5 no.
Puede simplemente agregar una barra inclinada hacia adelante en la ruta y usar la url
como lo hace normalmente.
backgound-image: url("/assets/rails.png")
Si ha actualizado su aplicación a Rails 3.1 en el pasado, asegúrese de haber cambiado su archivo application.rb de
# If you have a Gemfile, require the gems listed there, including any gems
# you''ve limited to :test, :development, or :production.
Bundler.require(:default, Rails.env) if defined?(Bundler)
a
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require *Rails.groups(:assets => %w(development test))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
Vea esta transmisión de rieles en la actualización a Rails 3.1 y agregue la canalización de activos.
Actualización: Rails 4 vuelve a la forma antigua de hacerlo. Gracias Aaron Gray !
# Require the gems listed in Gemfile, including any gems
# you''ve limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)