Rails 4 image-path、image-url 和 assets-url 不再在 SCSS 文件中工作

Posted

技术标签:

【中文标题】Rails 4 image-path、image-url 和 assets-url 不再在 SCSS 文件中工作【英文标题】:Rails 4 image-path, image-url and asset-url no longer work in SCSS files 【发布时间】:2013-05-26 10:33:57 【问题描述】:

除了image-url 和 Rails 4 中的其他内容之外,我们是否应该使用其他内容?它们返回似乎没有意义的不同值。如果我在/app/assets/images/logo.png 中有logo.png 并且我执行以下操作,这就是我得到的:

image-url("logo.png") -> url("/images/logo.png") #obviously doesn't work
image-path("logo.png") -> "/images/logo.png"
asset-url("logo.png") -> url("/logo.png")

当然,这些都不起作用,因为它们前面至少需要/assets

更新:实际上,我刚刚注意到,如何在 Rails 4 中访问图像?我在/app/assets/images/logo.png 有一张图片。但是,如果我访问以下任何一个 URL,我仍然看不到我的图像:

http://localhost:3000/assets/logo.png
http://localhost:3000/assets/images/logo.png
http://localhost:3000/logo.png
http://localhost:3000/images/logo.png

更新 2:我可以调出我的 logo.png 的唯一方法是将其移动到 /app/assets/stylesheets 目录然后拉起:

http://localhost:3000/assets/logo.png

【问题讨论】:

试试这个:asset_path("logo.png", image) @depa - 只是转换为“/logo.png”,不会显示我的图像。 您是在.css 文件中还是在.css.scss 文件中使用该助手? @depa - 不使用任何助手。我认为这是一个更大的资产问题,只是不适用于我的图像文件夹 @depa - 哦,我明白你在问什么。它在.css.scss 文件中 【参考方案1】:

我自己也遇到过这个问题。 希望有帮助的 3 点:

如果您将图像放在app/assets/images 目录中,那么您应该能够直接调用图像,路径中没有前缀。 IE。 image_url('logo.png') 根据您使用资产的位置,将取决于方法。如果您将它用作background-image: 属性,那么您的代码行应该是background-image: image-url('logo.png')。这适用于 less 和 sass 样式表。如果您在视图中内联使用它,那么您将需要使用 rails 中内置的 image_tag 帮助器来输出您的图像。再一次,没有前缀<%= image_tag 'logo.png' %> 最后,如果您正在预编译资产,请运行 rake assets:precompile 生成资产,或运行 rake assets:precompile RAILS_ENV=production 进行生产,否则,您的生产环境在加载页面时将没有指纹资产。

对于第 3 点中的那些命令,如果您正在运行 bundler,您还需要在它们前面加上 bundle exec

【讨论】:

另外一点是阅读文档guides.rubyonrails.org/asset_pipeline.html。如果正在加载图像,您还可以在浏览器的 Web Developer Debug 中看到吗? 现在这就是你写答案的方式。每个场景。预测“假设”,没有松散的结局。一个“看过战斗”的人的标记(真的解决了这个问题)。 我被多次错过 RAILS_ENV=production 所困扰。【参考方案2】:

您的第一个公式image_url('logo.png') 是正确的。如果找到图像,它将生成路径/assets/logo.png(加上生产中的哈希)。但是,如果 Rails 找不到您命名的图像,它将回退到 /images/logo.png

下一个问题是:为什么 Rails 没有找到您的图像?如果你把它放在 app/assets/images/logo.png 中,那么你应该可以通过 http://localhost:3000/assets/logo.png 访问它。

如果可行,但您的 CSS 没有更新,您可能需要清除缓存。从你的项目目录中删除tmp/cache/assets并重启服务器(webrick等)。

如果失败,您也可以尝试仅使用 background-image: url(logo.png); 这将导致您的 CSS 查找具有相同相对路径(在本例中为 /assets)的文件。

【讨论】:

只是为了跳上这一点,我被图像路径上的双引号而不是单引号咬住了。您在 css/scss 文件中的资产帮助程序中经常使用单引号。 我得到“未定义的局部变量或方法 `image'” 你会不会不小心在图片前面放了一个空格?【参考方案3】:

我刚刚发现,使用asset_url helper 可以解决这个问题。

asset_url("backgrounds/pattern.png", image)

【讨论】:

我收到undefined local variable or method 'image' 错误。 也许在 Rails 上发生了一些变化,这个答案已经过时了!你可以试试asset_path("<your_path>", type: :image)【参考方案4】:

我遇到了类似的问题,尝试使用内联 css 添加背景图像。由于资产同步的工作方式,无需指定图像文件夹。

这对我有用:

background-image: url('/assets/image.jpg');

【讨论】:

谢谢,我在做assets/img.jpg../assets/img.jpg,这显然在任何目录中都不起作用。 /assets/img.jpg 确实如此。 TY【参考方案5】:

Rails 4.0.0 看起来像使用 image-url 定义的图像,在与您的 css 文件相同的目录结构中。

例如,如果你的 css 在assets/stylesheets/main.css.scssimage-url('logo.png') 变成url(/assets/logo.png)

如果您将 css 文件移动到 assets/stylesheets/cpanel/main.css.scssimage-url('logo.png') 将变为 /assets/cpanel/logo.png

如果要直接使用assets/images目录下的image,可以使用asset-url('logo.png')

【讨论】:

【参考方案6】:

对于样式表: url(asset_path('image.jpg'))

【讨论】:

url(asset_path('image.jpg')url('image.jpg')image-url('image.jpg') 的主要区别是什么?我正在使用 Rails 5.0.0.1url()SCSS 文件和 中工作正常>html.erb 文件我使用asset_path() 所以我想知道正确的方法。提前致谢。 asset_path 向图像文件添加摘要附录。它实际上是用于生产的,每次部署后都会更改摘要附录,并且用户的浏览器将下载新版本的图像。【参考方案7】:

如果有人来寻找如何从 rails 控制台

生成相对路径
ActionView::Helpers::AssetTagHelper
image_path('my_image.png')
=> "/images/my_image.png"

控制器

include ActionView::Helpers::AssetTagHelper
image_path('my_image.png')
=> "/images/my_image.png"

【讨论】:

以上是关于Rails 4 image-path、image-url 和 assets-url 不再在 SCSS 文件中工作的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 + Less 的图片网址不包括哈希

sass-rails 助手“image-url”、“asset-url”在 rails 3.2.1 中不起作用

Rails 4:资产未在生产中加载

获取 STI 中的记录以获取 rails 4 中的空 has_many 记录

我的控制器索引视图的背景图像未在 rails 4 应用程序中加载?

Rails 4.2 不创建非消化资产