2012-04-30 109 views
22

时,而不是具有页面内联CSS包括带有链接的样式标记在哪里得到的CSS,我可以使用Rails' stylesheet_link_tag helper方法添加到我的观点,我想有css直接在页面内嵌入。如何使用滑轨资产管道

这是我想出了迄今:

%style(type="text/css")=File.read(physical_asset_path("email.css")) 

但我找不到任何Rails的helper方法,这给了我一个资产的物理路径 - physical_asset_path是发明只是一个虚拟的方法我。

任何人都知道如何使用Rails 3.2.x中时,获得资产的物理路径?

有没有更简单/更好的方式来获得样式表 - 从css文件共轨资产路径内 - 内联?

使用案例:大多数电子邮件客户端不访问外部资源(如CSS,图像),而无需用户确认。为了让电子邮件正确显示,我需要将CSS嵌入到电子邮件的HTML中。

回答

16

使用premailer或premailer-Rails3中

https://github.com/fphilipe/premailer-rails3https://github.com/alexdunae/premailer

乔的书呆子党说:

我们还使用了Premailer宝石自动内联在电子邮件中的链接 样式表观点。我们的电子邮件布局看起来像:

%html 
    %head 
    = stylesheet_link_tag 'email' 

    %style{:type => "text/css"} 
     :sass 
     @media all and (max-width: 480px) 
      table#container 
      width: auto !important 
      max-width: 600px !important 
     ... and so on for the mobile code 

    %body 
     Email body here. 
     %table 
     Lots of tables. 

我们在HTML样式表。 Premailer会下载它,处理 它,并将内嵌的css规则插入到HTML中。

@media规则需要在电子邮件布局中内联,因为 Premailer无法处理那些在单独的css文件中。

我们使用premailer-Rails3中以Premailer集成到Rails 3 不幸的是,我们发现一堆premailer bug和 premailer-Rails3中的。我们项目的叉在 https://github.com/joevandyk/premailerhttps://github.com/joevandyk/premailer-rails3。叉修复一些 编码错误,消除由 premailer-Rails3中做了一些奇怪的CSS处理的东西,让premailer不剔除在电子邮件中嵌入布局规则 ,和其他一些东西。

我们还发现了一个sass-rails中的错误,您无法在 inline sass代码中嵌入图像网址。请参阅https://github.com/rails/sass-rails/issues/71 Premailer-rails3挂接到ActionMailer,当邮件实际上是 交付时,不只是生成。在运行测试时,电子邮件并非实际发送的 ,所以在 测试期间,premailer-rails3挂钩不会运行。我没有花时间去查看是否有可能在测试期间运行预编译器处理,但这将是一个不错的 要做的事情。

另外,我们在premailer-rails3上的分支假设你想要预制器 外出并实际下载链接的CSS文件。它应该是 可能使用Rails 3.1资产管道获取处理的css 而不下载它。非常特别的感谢乔丹Isip谁 做了超级烦人的工作,以确保电子邮件在所有 外观不同的客户看起来不错。写这个CSS/HTML没有看起来 的乐趣。

更新:

Roadie似乎是一个更好的选择。感谢塞斯布罗指出。

+0

伟大的东西,谢谢! :) – gucki

+1

您叉不为我工作,所以我最终创建自己的叉子,改变它的做法:https://github.com/phuongnd08/premailer-rails3/ –

+0

我有更好的运气长期使用[视Roadie](https://github.com/Mange/roadie)。最后我检查了(几年前),premailer-rails有一些怪癖。 –

56

Rails.application.assets.find_asset('email').to_s将作为字符串返回编译后的资产。

+1

这就是我正在寻找的东西。谢谢! – jpadvo

+1

不幸的是,资产将不会被压缩 – haimg

+16

这是行得通!但有必要添加一个'.html_safe',这样它就不会引号:'Rails.application.assets.find_asset('email')。to_s.html_safe' – hsgubert

4

无法对Seth Bro的回答添加评论。您最好使用#[]而不是#find_assetRails.application.assets["email"].to_s

“资产将不会被压缩”。这不是真的。

Rails.application.configure do 
    # ... 
    config.assets.css_compressor = :sass 
    config.assets.js_compressor = :uglify 
end 

注意,在默认情况下,这是在生产环境(config/environments/production.rb)启用:如果您启用压缩机(在轨配置)将被压缩。

+0

你能举一个你说的压缩机的例子吗?我无法得到它压缩。 –

+0

添加了一个示例来回复。 – ixti

+0

似乎在生产中不起作用。任何工作?资产似乎没有。 –

1

TL;博士(无视Roadie):

%style(type="text/css") 
    = render template: '../assets/stylesheets/email_responsive.css' 

对于实际应用的CSS的内联样式,我建议roadie-rails(这是Rails包装器Roadie)。它也有其他的整齐的功能,如绝对值化href S,src小号等

的使用结合两种内联(email.scss)和非内联(email_responsive.css)样式表,都驻留在app/assets/stylesheets

-# This will be inlined and applied to HTML elements. 
-# Note that you need to include this in your asset config, e.g.: 
-# Rails.application.config.assets.precompile += %w(... email.css) 
-# (You need to list it as `email.css` even if it's actually `email.scss`.) 

= stylesheet_link_tag 'email' 


-# E.g. for media queries which can't be inlined - yeah, some iOS devices support them. 
-# This will not be inlined and will be included as is (thanks to `data-roadie-ignore`). 
-# `template:` marks it as a full template rather than a partial and disables `_` prefix. 
-# We need to add the extension (`.css`) since it's non-standard for a view. 

%style(type="text/css" data-roadie-ignore) 
    = render template: '../assets/stylesheets/email_responsive.css' 
7

(很抱歉,这答案是html,不HAML ......但这不应该成为HAML风扇有问题)

我发现,当这个问题LO请联系Sass编辑为css转换为html以创建html电子邮件模板。

综合以上意见,我曾经在我的html页的head下面的代码:

<style type="text/css"> 
    <%= Rails.application.assets['path/to/sass/file'].to_s.html_safe %> 
</style> 

此代码编译为SassCSS然后插入CSS为<style>标签。 html_safe确保在css中使用的任何引号('")或尖括号(><)不会被转义。

path/to/sass/file是一样创建一个样式表的链接标签时,你可以使用:

<%= stylesheet_link_tag 'path/to/sass/file', :media => 'all' %> 
5

Rails.application.assets['asset.js']将只在当地的环境,如导轨资产编译在生产和暂存环境中禁用。

Rails.application.assets_manifest.find_sources('asset.js').first.to_s.html_safe应使用使用滑轨资产管道时,内联CSS。

+2

该解决方案适用于我的生产。 –

1

我试图内嵌CSS在与谷歌的轨道兼容功放使用的页面。我从vyachkonovalov找到了以下帮手,这是我在生产和本地工作中唯一的一件事。

添加以下到erb模板:

<style amp-custom> 
    <%= asset_to_string('application.css').html_safe %> 
</style> 

而且帮手ApplicationHelper。它在当地和生产中完美运作。

module ApplicationHelper 
    def asset_to_string(name) 
    app = Rails.application 
    if Rails.configuration.assets.compile 
     app.assets.find_asset(name).to_s 
    else 
     controller.view_context.render(file: File.join('public/assets', app.assets_manifest.assets[name])) 
    end 
    end