我正在构建一个应用程序,允许用户上传他们的主题以自定义方式显示数据.每个主题应包括所有必要的资源,如html模板(使用Liquid),css文件,javascripts和图像.结果应该与Shopify允许对客户做的非常相似.
我正在努力为用户找到提交主题的最佳方式,并为应用程序提供服务.具体来说,最佳做法是什么:
提前致谢.
Chrome DevTools自动保存不适用于Rails Asset Pipeline.问题的罪魁祸首是资产URL - 我无法通过其URL解密实际文件路径.例如,/ assets/application.css可以引用app/assets/stylesheets/application.css,lib/assets/stylesheets/application.css或vendor/assets/stylesheets/application.css.
我想知道,如何将资产URL更改为以下之一:
我很感激为此编写Rails插件的任何帮助.
ruby-on-rails ruby-on-rails-plugins google-chrome-devtools asset-pipeline
我有一个可以在任何网站上加载的书签.
它的工作原理如下;
http://my.example.com/assets/bookmarklet.jshttp://my.example.com/assets/bookmarklet.csscss文件被添加到dom via中bookmarklet.js,因此需要知道它在哪里.
我的代码如下;
// assets/javascripts/bookmarklet.js.erb
var config = {
stylesheetUrl: '<%= asset_path("bookmarklet.css", :only_path => false) %>'
}
Run Code Online (Sandbox Code Playgroud)
但无论我尝试什么,这都呈现为
var config = {
stylesheetUrl: '/assets/bookmarklet.css'
}
Run Code Online (Sandbox Code Playgroud)
我需要asset_path返回一个完整的URL.但是asset_url不存在,我找不到一个选项asset_path,它将在当前域之前添加.
有解决方案吗
好的,所以我已经转换了我的这个多皮肤的应用程序,以利用Rails 3.1中引入的资产管道.在大多数情况下,它非常简单,我喜欢预处理能力,它允许您在CSS/JS文件中使用内联Ruby.我遇到了一个主要问题,尽管Sprockets的强大功能似乎很难解决.我的应用程序可以在运行时选择任意数量的皮肤(或"身份")运行.这个"身份"参数设置了诸如缓存目录,数据库连接,视图路径之类的东西 - 实际上是资产路径.虽然所有"身份"都可以拥有自己的样式表,但还有一个共享的样式表可用于所有实例.所以assets文件夹结构看起来像这样:
在/app/assets/stylesheets/aplication.css.erb中:
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
Run Code Online (Sandbox Code Playgroud)
这会加载两个样式表,关键是它使用配置的资产路径来解决它们(这就是我使用require_assets而不是标准require和include指令的原因,因为它们没有击中解析器).它返回找到的第一个匹配项,并允许我非常轻松地覆盖部分或全部默认样式.所以
/app/assets/stylesheets/shared.css
Run Code Online (Sandbox Code Playgroud)
可以通过在实例资源文件夹中放置具有相同名称的文件来覆盖
/app/assets/[identity]/stylesheets/shared.css
Run Code Online (Sandbox Code Playgroud)
如果没有这样的文件,它会默默地回退到默认的shared.css.
这一切都运行得非常出色 - 我对Javascripts,图像和字体使用相同的技术,并且在预编译期间一切都得到了整齐的处理和打包.但.有一种(横向)继承我无法实现; 有时身份的皮肤与另一个只有少数几条线条不同的皮肤(例如相同的布局但颜色方案不同)非常相似,我真的希望能够做到这样的事情:
资产/样式表/ application.css.erb:
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
Run Code Online (Sandbox Code Playgroud)
资产/ current_identity /样式表/ overrides.css:
<% require_asset("../../some_other_identity/stylesheets/overrides.css") %>
/* followed by the dosen or so lines that differ for this skin */
...
Run Code Online (Sandbox Code Playgroud)
这个FAILS因为在当前上下文中"some_other_identity"不在资产路径中--Rails没有在开发模式下找到文件,当然它也不包括在预编译期间.如果我将它包含在资源路径中,则会加载错误的覆盖.css(只能有一个).所以我一直在尝试将这样的东西放在overrides.css的顶部:
<%= File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css")) %>
/* rest of CSS */
...
Run Code Online (Sandbox Code Playgroud)
事实上,这与预期一样有效.但.因为我现在正在使用资产管道来提供所有资产,所以我不能再使用固定路径引用CSS中的图像 - 我必须使用<%= asset_path("some_image.png") %>路径解析器才能发挥其魔力.这意味着我overrides.css的确是overrides.css.erb,当然,当您这样做时,ERB预处理不会发生 …
在Rails 3.2.2中,我有以下样式表:
app/assets/stylesheets
|
|-- application.css
|-- bootstrap_and_overrides.css.less
|
|-- annotations.css.less
|-- maps.css.less.erb
`-- users.css.less.erb
前两个或多或少是系统默认的.其他是我定义自定义样式的地方.
所以,application.css像往常一样,包括所有其他文件:
*= require_self
*= require_tree .
Run Code Online (Sandbox Code Playgroud)
而且bootstrap_and_overrides.css.less,当然,包括Twitter的引导,以及一些其他的自定义的LESS变量.
@import "twitter/bootstrap/bootstrap";
@import "twitter/bootstrap/responsive";
// other stuff
@brown_text: #332820;
Run Code Online (Sandbox Code Playgroud)
现在,annotations.css.less我想使用@brown_text,但它给了我:
variable @brown_text is undefined
我认为这是因为没有引用annotations.css.less定义变量的"主"文件.而且似乎annotations.css.less首先编译 - 请注意我目前处于开发环境中.
那么,我如何使用我的自定义LESS变量,并使其在其他样式表文件中可用?我目前的"修复"是将我的所有自定义样式移动到bootstrap_and_overrides.css.less.erb其中,这看起来根本不是很干净.
仅仅import使用LESS文件是不可能的,因为它们使用Rails的资产路径助手.并且导入ERB文件也是不可能的,因为该@import语句将找不到该文件,因为它需要.less后缀.
我正在尝试将设计者的html和css文件集成到rails应用程序中.他有大约四个@ font-face文件,这些文件当前链接到application.css文件中.我已将字体存储在assets/fonts文件夹中,并将该文件夹添加到资产管道中(在config/application.rb中)
我只使用了Google字体,我在application.html.erb文件中包含了google的链接.
我该如何包含这些字体文件?他们应该(1)保留在application.css文件中,还是(2)在app.html.erb文件中链接到javascript和styesheets?例如,像这样:
<%= asset_path('my_webfont.eot') %>
Run Code Online (Sandbox Code Playgroud) 服务资产今天开始创建此错误:
!! Rack application returned nil body. Probably you wanted it to be an empty string?
!! Unexpected error while processing request: undefined method `each' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
我正在使用coffeescript和SCSS(application.js.coffee和application.css.scss)
来自Gemfile:
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'compass-rails'
gem 'coffee-rails', '~> 3.2.1'
gem 'marionette-rails'
gem 'uglifier', '>= 1.0.3'
end
Run Code Online (Sandbox Code Playgroud)
使用ruby 1.9.3-p392和1.9.3-p125会导致此问题.此错误的Google结果几乎不存在.
我显然必须在这里做错事.我正在与资产管道(再次)搏斗.我有一个自定义字体,在我看来,要正确编译我需要asset_path()在多个地方使用,但它有一个意想不到的效果.
我知道有几种方法可以做到这一点,但这就是我目前所拥有的:
在application.css.scss.erb:
@import "<%= asset_path("my-font.css") %>";
my-font.css的源文件是app/assets/stylesheets/my-font.css.erb(它需要是一个.erb因为我也在asset_path()那里使用).
在application.rb我添加my-font.css到预编译列表.
config.assets.precompile << 'my-font.css'
当我清理public/assets并运行rake assets:precompileEverything的编译时,使用摘要,但应用于实际文件的摘要与计算和输入的摘要不同application.css.
生成的文件
public/assets/my-font-2f25682a1ea904a866ef9f44101a5a2e.css在public/assets/application-bba2edaee36771f4bdb5c89b8ec90aaf.css引用中是:
@import url(/assets/my-font-ed843d3b174ca427edf963e473ad9e9b.css);
我意识到我可能asset_path()比我应该使用更多,并且还通过url()导入文件而不是要求它们,但这让我最接近让事情发挥作用.
我怀疑其中一个摘要是在my-font.css 上通过ERB 之前计算的,另一个是在之后,但我不明白为什么以及如何修复它.
建议?
我们刚刚将Rails 4.0.3应用程序部署到生产环境中,并发现由指纹生成stylesheet_link_tag并javascript_link_tag丢失指纹的资产路径.因此application-c841bd1c82c25bb1de8452d2338479f7.js,页面只是请求,而不是请求类似的东西application.js.
RAILS_ENV=production bundle exec rake assets:precompile 成功并生成指纹文件.
config/environments/production.rb这似乎相关的位是:
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false
Run Code Online (Sandbox Code Playgroud)
这是在我们自己的Apache服务器上运行,而不是Heroku.我已经看了很多,发现了类似的问题,但这些问题的故障排除步骤都没有帮助.谢谢.
更多信息
如果它有用,这里是我们的配置文件的完整内容(删除了注释行):
application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
if defined?(Bundler)
# If you …Run Code Online (Sandbox Code Playgroud) 我使用bootstrap3-wysihtml5,一些图标使用glyphicons字体.
我在我的rails应用程序中运行生产时使用glyphicons-halflings-regular字体时遇到问题.我的Chrome浏览器控制台正在显示
Failed to decode the downloaded font
Run Code Online (Sandbox Code Playgroud)
并且字体图标未显示.我看到图标应该显示的方框.即使在本地预编译并在本地作为生产运行,字体似乎也在本地工作.我在生产中运行资产预编译.
我的字体最初位于plugins下的vendor目录中,并附加了config.assets.paths的路径.
我已经确保CSS文件中的路径是正确的,因为我可以通过浏览器URL成功访问该文件.并且控制台警告显示"无法解码下载的字体"这一事实意味着它可以访问它.只是无法理解该文件.
我也尝试在rails mimetype配置中注册Mimetypes:
Mime::Type.register 'application/x-font-woff', :woff
Mime::Type.register 'application/font-woff2', :woff2
Mime::Type.register 'application/x-font-ttf', :ttf
Mime::Type.register 'application/vnd.ms-fontobject', :eot
Run Code Online (Sandbox Code Playgroud)
我还尝试将字体放在公共文件夹中并相应地引用,从而将字体移出资产管道,但我遇到了同样的问题.
有没有人对我如何解决这个问题有任何想法?
使用:Rails 4.1.6 Ruby 2.2.2