Ruby-on-rails 如何在 Rails 中显示 SVG 图像?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36986925/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 00:24:17  来源:igfitidea点击:

How do I display SVG image in Rails?

ruby-on-railsruby-on-rails-4svg

提问by Roelof Wobben

I have a svg image on /app/asssets/images/symbols.svg with this as contents.

我在 /app/asssets/images/symbols.svg 上有一个 svg 图像,以此作为内容。

<svg xmlns="http://www.w3.org/2000/svg"><symbol id="icon-search" viewBox="0 0 18 18"><path fill="currentColor" d="M12.8 11.4c.9-1.2 1.4-2.7 1.4-4.3C14.2 3.2 11 0 7.1 0S0 3.2 0 7.1c0 3.9 3.2 7.1 7.1 7.1 1.6 0 3.1-.5 4.3-1.4l5.2 5.2 1.4-1.4-5.2-5.2zM2 7.1C2 4.3 4.3 2 7.1 2s5.1 2.3 5.1 5.1-2.3 5.1-5.1 5.1S2 9.9 2 7.1z"/></symbol><symbol id="icon-view-default" viewBox="0 0 18 18"><g fill="currentColor"><path d="M8 11H0V0h8v11zM18 5h-8V0h8v5zM8 18H0v-5h8v5zM18 18h-8V7h8v11z"/></g></symbol><symbol id="icon-view-alt" viewBox="0 0 18 18"><g fill="currentColor"><path d="M8 8H0V0h8v8zM18 8h-8V0h8v8zM8 18H0v-8h8v8zM18 18h-8v-8h8v8z"/></g></symbol><symbol id="icon-view-full" viewBox="0 0 18 18"><g fill="currentColor"><path d="M18 8H0V0h18v8zM18 18H0v-8h18v8z"/></g></symbol><symbol id="icon-facebook" viewBox="0 0 9 19"><path fill="currentColor" d="M6.7 3.6H9V0H6.3c-3.3.1-4 2.1-4 4.1V6H0v3.5h2.2V19h3.4V9.5h2.8L8.9 6H5.6V4.9c0-.7.4-1.3 1.1-1.3z"/></symbol><symbol id="icon-twitter" viewBox="0 0 17.9 15"><path fill="currentColor" d="M17.9 1.8c-.3.2-1.2.5-2 .6.5-.3 1.3-1.3 1.5-2.1-.5.3-1.7.8-2.3.8C14.4.5 13.5 0 12.4 0c-2 0-3.7 1.7-3.7 3.8 0 .3 0 .6.1.8-2.8-.1-6-1.5-7.8-4-1.1 2-.2 4.2 1.1 5-.4 0-1.2-.1-1.6-.4 0 1.3.6 3.1 2.9 3.7-.5.4-1.3.3-1.6.3.1 1.1 1.6 2.6 3.3 2.6-.6.7-2.6 2-5.1 1.6 1.7 1 3.7 1.6 5.8 1.6 6 0 10.6-5 10.3-11.1v-.1c.6-.4 1.3-1.1 1.8-2z"/></symbol><symbol id="icon-pinterest" viewBox="0 0 18 18"><path fill="currentColor" d="M2.3 0h13.4C17 0 18 .9 18 2.3v13.4c0 1.4-1 2.3-2.3 2.3H2.3C1 18 0 17.1 0 15.7V2.3C0 .9 1 0 2.3 0zm10.8 2c-.4 0-.8.4-.8.8v1.9c0 .4.4.8.8.8h2c.4 0 .8-.4.8-.8V2.8c.1-.4-.3-.8-.8-.8h-2zM16 7.6h-1.6c.2.5.2 1 .2 1.5 0 3-2.5 5.4-5.6 5.4-3.1 0-5.6-2.4-5.6-5.4 0-.5.1-1.1.2-1.5H2v7.6c0 .4.3.7.7.7h12.5c.4 0 .7-.3.7-.7l.1-7.6zM9 5.5C7 5.5 5.4 7 5.4 9c0 1.9 1.6 3.5 3.6 3.5s3.6-1.6 3.6-3.5c0-2-1.6-3.5-3.6-3.5z"/></symbol><symbol id="icon-tumblr" viewBox="0 0 11 19"><path fill="currentColor" d="M8.6 15.9c-1.6 0-2.3-1.3-2.3-2.2V7.8h4.1v-3h-4V.1S4.7 0 3.5 0C3.5 4.1 0 4.9 0 4.9v2.8h2.3v7C2.3 17.1 4.4 19 7 19s4-1.1 4-1.1v-3.1c0 .1-.8 1.1-2.4 1.1z"/></symbol><symbol id="icon-menu" viewBox="0 0 274.5 224.5"><g fill="currentColor"><path d="M274 53.8H.5V.5H274v53.3zM274 138.9H.5V85.6H274v53.3zM274 224H.5v-53.3H274V224z"/></g></symbol><symbol id="bar" viewBox="0 0 274.5 54.3"><path fill="currentColor" d="M274 53.8H.5V.5H274v53.3z"/></symbol><symbol id="arrow" viewBox="0 0 38 14"><path fill="currentColor" d="M31 0l-1.4 1.4L34.2 6H0v2h34.2l-4.6 4.6L31 14l7-7-7-7z"/></symbol><symbol id="refresh" viewBox="0 0 19 16"><path fill="currentColor" d="M9.4 6.2l5.9 4.4L19 4.4l-1.7-1L15.7 6c-.9-3.5-4-6-7.7-6-4.4 0-8 3.6-8 8s3.6 8 8 8c2.1 0 4.1-.8 5.6-2.3l-1.4-1.4C11.1 13.3 9.6 14 8 14c-3.3 0-6-2.7-6-6s2.7-6 6-6c3 0 5.4 2.2 5.9 5l-3.3-2.4-1.2 1.6z"/></symbol></svg>

Now on a html template which I found on the net the images are shown with :

现在在我在网上找到的 html 模板上,图像显示为:

  <svg>
      <use xlink:href="assets/img/symbols.svg#bar"></use>
    </svg>

How can I make this work on rails.

我怎样才能在导轨上进行这项工作。

I tried :

我试过 :

 <use xlink:href="images/symbols.svg#bar"></use>

and the svg-inline gem

和 svg-inline gem

but on both I see no images on my webpage.

但在我的网页上都看不到图像。

Can anyone help me figure out how to make this work ?

谁能帮我弄清楚如何使这项工作?

回答by Elvn

Displaying SVGs (scalable vector graphics) in a Rails app

在 Rails 应用程序中显示 SVG(可缩放矢量图形)

Specifically include the SVG filetype in asset compilation

具体包括资产编译中的SVG文件类型

production.rb 

  config.assets.precompile += %w( '.svg' )  

  # Must include to get inline SVGs to work in deploy
  config.assets.css_compressor = :sass

Create a helper to display the SVG

创建一个助手来显示 SVG

myhelper.rb

def show_svg(path)
  File.open("app/assets/images/#{path}", "rb") do |file|
    raw file.read
  end
end

Invoke the SVG processing helper in your view

在您的视图中调用 SVG 处理助手

<%= show_svg('symbols.svg') %>


From your question I'm not 100% clear about your implementation, but these steps should get you to the point where your SVG image is visible. Once you have the SVG visible, you can apply CSS.

从你的问题来看,我不是 100% 清楚你的实现,但这些步骤应该让你看到你的 SVG 图像。使 SVG 可见后,您就可以应用 CSS。

回答by yuval

Try the inline_svggem, it adds a helper method for in-lining SVG from a file directly into your template

试试inline_svggem,它添加了一个辅助方法,用于将文件中的 SVG 直接内联到您的模板中

回答by Stef Hej

You can display SVGs in the same way as images.

您可以以与图像相同的方式显示 SVG。

For example in haml:

例如在haml中:

%img{:src => "/images/image1.svg"}

hope it helps!

希望能帮助到你!

回答by maguri

Create a helper: (content is different in each case, custom your own one)

创建一个助手:(每个案例内容不同,自定义一个)

def icon(icon, css_class: "")
  content_tag(:svg, class: "icon icon_#{icon} #{css_class}") do
      content_tag(:use, nil, 'xlink:href' => "#icon_#{icon}")
  end
end

Use it like this:

像这样使用它:

<%= icon 'arrow-menu' , css_class: 'arrow-breadcrumb' %>

回答by tmikeschu

I've been trying different solutions for this, and ultimately landed on just putting the svg doc in an html.erbpartial. Since svg is valid html, it works fine to just move it from assets to views.

我一直在为此尝试不同的解决方案,最终只是将 svg 文档放在了html.erb部分中。由于 svg 是有效的 html,因此只需将其从资产移动到视图即可。

<%# app/views/home/index.html.erb %>

<%= render partial: "svgs/some_svg.html.erb"

Given

给定的

app
| views
| | home
| | | index.html.erb
| | svgs
| | | some_svg.html.erb

回答by nvn

Its straightforward:

它的直截了当:

First, add the svg to the asset precompile list in assets.rb

首先,将svg添加到assets.rb中的资产预编译列表中

application.config.assets.precompile +=
    %w(<your other files> symbol-defs.svg)

Then reference it in your erb/haml files as shown below:

然后在您的 erb/haml 文件中引用它,如下所示:

<svg class="icon gr-menu">
  <use xlink:href="<%= asset_path('symbol-defs') %>#gr-menu"></use>
</svg>

回答by victor sosa

I really don't know how parse the SVG files; but this same thing can be use to the SVG files. You can then use the asset_path helper in the SVG file; but the catch is by default rails parse CSS, JS and ERB. In that way the link inside the SVG can work with the asset pipeline. Maybe if you try to change the name from 'symbols.svg' to 'symbols.svg.erb' it will parse the file to get the correct url.

我真的不知道如何解析 SVG 文件;但是同样的事情可以用于 SVG 文件。然后您可以在 SVG 文件中使用 asset_path 助手;但问题是默认情况下 rails 解析 CSS、JS 和 ERB。通过这种方式,SVG 内部的链接可以与资产管道一起使用。也许如果您尝试将名称从“symbols.svg”更改为“symbols.svg.erb”,它会解析文件以获取正确的 url。

You problem is that the asset pipeline is not be used in accord to rails.

你的问题是资产管道没有按照 rails 使用。

and this is how you could parse (preprocess) svg files:

这就是解析(预处理)svg 文件的方法:

The default matcher for compiling files includes application.js, application.css and all non-JS/CSS files (this will include all image assets automatically) from app/assets folders including your gems: [ Proc.new { |filename, path| path =~ /app/assets/ && !%w(.js .css).include?(File.extname(filename)) }, /application.(css|js)$/ ]

编译文件的默认匹配器包括 application.js、application.css 和来自 app/assets 文件夹的所有非 JS/CSS 文件(这将自动包括所有图像资产),包括您的 gem:[ Proc.new { |filename, path| path =~ /app/assets/ && !%w(.js .css).include?(File.extname(filename)) }, /application.(css|js)$/ ]

More info about the helpers methods

有关 helpers 方法的更多信息

2.3.2 CSS and Sass

When using the asset pipeline, paths to assets must be re-written and sass-rails provides -url and -path helpers (hyphenated in Sass, underscored in Ruby) for the following asset classes: image, font, video, audio, JavaScript and stylesheet.

image-url("rails.png") becomes url(/assets/rails.png)
image-path("rails.png") becomes "/assets/rails.png".

The more generic form can also be used:

asset-url("rails.png") becomes url(/assets/rails.png)
asset-path("rails.png") becomes "/assets/rails.png"

2.3.3 JavaScript/CoffeeScript and ERB

If you add an erb extension to a JavaScript asset, making it something such as application.js.erb, you can then use the asset_path helper in your JavaScript code: $('#logo').attr({ src: "<%= asset_path('logo.png') %>" });

This writes the path to the particular asset being referenced.

Similarly, you can use the asset_path helper in CoffeeScript files with erb extension (e.g., application.js.coffee.erb): $('#logo').attr src: "<%= asset_path('logo.png') %>"

2.3.2 CSS 和 Sass

使用资产管道时,必须重新编写资产的路径,并且 sass-rails 为以下资产类提供 -url 和 -path 帮助器(在 Sass 中用连字符连接,在 Ruby 中用下划线表示):图像、字体、视频、音频、JavaScript 和样式表。

image-url("rails.png") becomes url(/assets/rails.png)
image-path("rails.png") becomes "/assets/rails.png".

也可以使用更通用的形式:

asset-url("rails.png") becomes url(/assets/rails.png)
asset-path("rails.png") becomes "/assets/rails.png"

2.3.3 JavaScript/CoffeeScript 和 ERB

如果您向 JavaScript 资产添加 erb 扩展,使其成为诸如 application.js.erb 之类的内容,那么您可以在 JavaScript 代码中使用 asset_path 助手: $('#logo').attr({ src: "<% = asset_path('logo.png') %>" });

这将写入所引用的特定资产的路径。

类似地,您可以在带有 erb 扩展名的 CoffeeScript 文件中使用 asset_path 助手(例如 application.js.coffee.erb): $('#logo').attr src: "<%= asset_path('logo.png') % >”

You can check: http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets

您可以查看:http: //guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets