sass-railsヘルパー「Image-url」、「asset-url」はRails 3.2.1で機能していません
-
25-10-2019 - |
質問
私は3.2.1で、Sass-Rails-3.2.4とSASS-3.1.15で...
資産パイプラインのドキュメントは次のように述べています。
asset-url("rails.png", image) becomes url(/assets/rails.png)
image-url("rails.png") becomes url(/assets/rails.png)
...
だから私は次のファイルを作成しました:
# app/assets/stylesheets/public/omg.css.sass
body
background: asset-url('snake.gif', image)
#lol
background: image-url('snake.gif')
そして、私がlocalhostにアクセスするとき:3000/assets/public/omg.css私は取得します:
body {
background: asset-url("snake.gif", image); }
#lol {
background: image-url("snake.gif"); }
...また、ファイルをOMG.CSSSSSSに変更してみましたが、構文を次のように変更しました。
# app/assets/stylesheets/public/omg.css.scss
body {
background: asset-url('snake.gif', image);
}
#lol {
background: image-url('snake.gif');
}
しかし、同じ結果が得られます...なぜこれらのヘルパーが機能していないのか、誰かが考えていますか?
解決
ドキュメントが言っていることにもかかわらず、Rails 3.2.6のデフォルトオプションにより、CSSのパス情報がさらに少ないことで物事を機能させることができます。例えば ../app/assets/images/rails.png
example.css.scssファイルの参照は次のようなものです。
background: white url(rails.png) repeat-y;
あなたはそれを含めません image-url
また asset-url
あなたのscssに(私が知っている限り)、ただ平凡な url(your_image.png)
. 。そのドキュメントの少しは、それがバックグラウンドで何をしているのかを説明しているようです。
他のヒント
私がこの問題にぶつかったとき、それは私が事前コンパイルのためにアセットパイプラインにCSSファイルを含めていなかったからです。その結果、実行時に生成されます。 SASS-Rails GEMは一般的に:Assets Groupにあるため、実行時にCSSファイルを生成する際にヘルパーは利用できません。
アプリケーションに次の行を追加してみてください。RB(またはproduction.rb):
config.assets.precompile += %w( public/omg.css )
修正を見つけました この郵便受け ファイルをプレキャコンパイラに追加するときにファイルを命名することを中心にゴッチャが含まれます。
過去にアプリをRails 3.1に更新した場合は、Application.RBファイルをから変更してください
# 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)
に
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
見る このRailscast Rails 3.1にアップグレードし、アセットパイプラインの追加。
アップデート: Rails 4は、それを行う古い方法に戻ります。ありがとう アーロン・グレイ!
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)
資産パイプラインを有効にしましたか application.rb
?
config.assets.enabled = true
SASSスタイルシートに拡張機能を設定することで、 .css.scss
. 。これにより、Railsは、CSSとしてコンテンツをエミングする前に、最初にSASSでファイルを解析することを知らせることができます。
クリア /TMP /キャッシュを試してみてください。私はこれがなぜ機能したのかを知るにはRailsやSassにはあまりにも新しいものですが、検索の数時間後に同じ問題を解決しました。
ところで、これは、変数の設定やそれらとの計算など、他のSASS指令が実行されているという事実にもかかわらず、これはうまくいきました。私はそれを追跡する時間があったら、非常に簡単な説明があると確信しています。
@Ryanが提案した変更を加え、SASS-Railsをアップグレードしました。
bundle update sass-rails
SASS 3.2.6は私のために働きましたが、3.2.5はそうではありませんでした。
同じ問題が発生し、Gemfileでスプロケットを明示的に必要とすることで修正しました(ActionPackの依存関係ですが):
group :assets do
gem 'sprockets'
gem 'sass-rails', '~> 3.2.3'
# ...
end
理由はわかりませんが、今は機能しています。 ;-)
私はこれに何日も頭を叩いてきました。私のために働いた唯一の解決策は次のとおりでした:
- GemfileのSass-Rails:Development Groupを確認してください。
それが修正されない場合は、「horrible_sass_patch.rb」のようなものと呼ばれるconfig/ initializersの新しいファイルに以下を追加します:
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
注:これには、「アクティブ」バンドラーロードメカニズムを使用している必要があります。
Bundler.require *Rails.groups(:assets => %w(development test))
...そして、スタイルシートがベンダーにある場合は、SASSの構成に含まれていることを確認してください。
if config.respond_to? :sass
config.sass.load_paths << Rails.root.join('vendor', 'assets', 'stylesheets')
end
トレーリングフォワードスラッシュを追加するだけです /
パスと使用 url
あなたがいつもそうするように。
background-image: url("/assets/rails.png")