我正在使用带有导轨的余烬.我想在rails资产管道中获取图像路径.emberjs在sass-rails中是否有像asset-path这样的功能?
我正在升级具有大量SCSS样式表的rails应用程序以使用资产管道,并且需要为每个文件包含一些全局变量和mixin.
@import在每个文件的顶部添加几个指令不是很干,所以我想做这样的事情:
# application.css
/*
*= require variables
*= require mixins
*= require_tree .
*/
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为变量不会跨文件持久存在.谁知道如何实现这一目标?
如果使用Rails 3.1资产管道,调用特定媒体(即打印,屏幕等)css的正确/ rails /最佳实践方法是什么?我知道之前已经问过这个问题,但我看到的所有解决方案看起来都非常糟糕,而不是我所期待的优雅的Rails解决方案.
据我所知,建议的方法是设置stylesheets文件夹,如下所示:
assets
-stylesheets
--application.css
--application-print.css
--print
---custom-print.css
--screen
---custom-screen.css
Run Code Online (Sandbox Code Playgroud)
application.css的内容是
/*
*= require_self
*= require_tree ./screen
*/
Run Code Online (Sandbox Code Playgroud)
application-print.css的内容是
/*
*= require_self
*= require_tree ./print
*/
Run Code Online (Sandbox Code Playgroud)
然后在布局中包含以下内容
<%= stylesheet_link_tag 'application', media = 'screen, projection' %>
<%= stylesheet_link_tag 'application-print', media = 'print' %>
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止一切顺利.
但是,在我的情况下,custom-print.css正在屏幕上应用,并且没有css应用于打印输出.
此外,这种方法似乎影响从css调用的图像.即不是在资产/图像中查找图像,而是在资产/样式表/屏幕中查找图像.这里可能还有其他东西,因为它似乎只是受到影响的javascript css.我会做更多的检查和报告.
所以我的问题是,你如何在Rails资产管道中处理媒体特定的css?什么被认为是最佳实践?我做错了什么?
谢谢你的时间!
在生产(Heroku)中,我收到以下错误:
Started GET "/articles/1" for 50.134.181.231 at 2012-06-17 00:37:35 +0000
2012-06-17T00:37:35+00:00 app[web.1]: ActionView::Template::Error ( isn't precompiled):
2012-06-17T00:37:35+00:00 heroku[router]: GET wandr.com/articles/1 dyno=web.1 queue=0 wait=0ms service=497ms status=500 bytes=728
2012-06-17T00:37:35+00:00 app[web.1]:
2012-06-17T00:37:35+00:00 app[web.1]: 74: = image_tag @article.featured_photo_url(:sm).to_s
2012-06-17T00:37:35+00:00 app[web.1]: 75:
2012-06-17T00:37:35+00:00 app[web.1]: 77: = image_tag @article.background_photo_url(:md).to_s
2012-06-17T00:37:35+00:00 app[web.1]: 76: %p
2012-06-17T00:37:35+00:00 app[web.1]: 78: %p
2012-06-17T00:37:35+00:00 app[web.1]: 79: = image_tag @article.cover_photo_url(:md).to_s
2012-06-17T00:37:35+00:00 app[web.1]: 80:
2012-06-17T00:37:35+00:00 app[web.1]: app/views/articles/show.html.haml:77:in `_app_views_articles_show_html_haml__1847247375488199378_48105500'
2012-06-17T00:37:35+00:00 app[web.1]:
2012-06-17T00:37:35+00:00 app[web.1]: app/controllers/articles_controller.rb:21:in `show'
2012-06-17T00:37:35+00:00 app[web.1]:
2012-06-17T00:37:35+00:00 app[web.1]: Processing by ArticlesController#show as HTML
2012-06-17T00:37:35+00:00 …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有一些依赖关系的rails引擎.我已经在gemspec中指定了依赖项,并且引擎在运行时找到它们bundle install(即Gemfile.lock看起来正确).当我想在Ruby文件中使用插件时,我可以这样做,但需要显式require dependency-name位于文件的顶部.
但是,当我想使用依赖项的资产管道时,sprockets无法找到它.
我正在使用的应用程序(现在)是一个虚拟应用程序,它位于rails插件的测试文件夹中.如果我在引擎的Gemfile(实际上是虚拟应用程序的Gemfile)中指定它们,Sprockets可以找到资产,但如果我在gemspec中指定它们则不会.我不想依赖Gemfile,因为这意味着任何使用我的插件的应用都需要手动将我的所有依赖项添加到他们的Gemfile中.出于同样的原因,我不想要一个涉及更新应用程序配置文件的解决方案.
当从gemspec中包含依赖项时,这适用于(在ruby文件中):
require 'dependency-name'
Run Code Online (Sandbox Code Playgroud)
但是当从gemspec中包含依赖项时,这(在JS文件中)不起作用:
//= require 'dependency-name'
Run Code Online (Sandbox Code Playgroud)
require从Gemfile中包含依赖项时,都不需要.我认为这很清楚,但如果您需要更多细节,请告诉我.
rubygems ruby-on-rails-plugins ruby-on-rails-3.1 asset-pipeline
我需要在Rails资产管道中的HTML5画布上显示图像,但我需要知道JavaScript中资产的路径.我正在为应用程序的其他部分使用js-routes,但它似乎没有提供一种方法来获取资产管道中的某些东西.
从JavaScript获取Rails资产(例如图像)路径的正确方法是什么?
我理解如何将一个javascript文件添加到rails资产管道.只需添加
//= require filename
Run Code Online (Sandbox Code Playgroud)
到application.js
但是如何在一个文件夹下包含许多javscripts文件
vendor/assets/javascripts/<js_library>
Run Code Online (Sandbox Code Playgroud)
或者我必须明确地列出它们?
对不起,如果这是一个简单问题的冗长积累,但我想清楚我的想法.
我现在已经在几个项目中使用了Rails 4,并且我一直在使用它image_tag('/assets/image.png')来解决资产路径助手在Rails 4中如何工作的变化.直到今天,当我决定更多地了解这些变化并发现第一次更改时注意在链轮轨道.我还注意到ASSET_PUBLIC_DIRECTORIESRails助手中的/actionview/lib/action_view/helpers/asset_url_helper.rb#L170只指向公用文件夹.对我来说很明显,如果你正在访问静态文件,Rails希望你使用公共文件夹.
所以现在我已经想到了这一点,我只是无法理解为什么edge rails docs清楚地说明了这一点:
在以前版本的Rails中,所有资产都位于公共子目录中,例如图像,javascripts和样式表.使用资产管道,这些资产的首选位置现在是app/assets目录.
image_path实际上会生成一个uri到public/images文件夹,这完全相反.
总而言之,我需要使用所有可用的帮助程序和摘要构建器,因为我最终使用asset_sync将资产部署到S3 .
所以我的问题只是; 是否有正确的位置来放置图像/非编译资产并使用asset_path助手?所有文档和所有其他堆栈溢出对话都是关于使用app/assets文件夹的人,但是sprockets-rails希望我们将public用于非摘要资产.网络上的文档和信息是否需要更新,或者其他人只是通过在/ assets /之前预先设置所有资产路径来实现?
更新:我认为我确实遇到了一个问题,我没有重新启动我的开发服务器,并且app/assets/images中的图像没有显示出来,所以它会回退到公众面前.还要注意我在我的paperclip default_url中使用了资产助手(在我找到的几个堆栈溢出答案中引用资源的方式被引用,但是在回形针中使用带有插值选项的资产路径助手也将回退到公众,因为未插入的资产名称显然不会被发现为现有文件.
在生产高效的盒子上编译资产时,我遇到了类似很多用户的类似问题.唯一的区别是我无法从跟踪中得到任何提示来解决问题.
rake assets:precompile RAILS_ENV=production --trace
** Invoke assets:precompile (first_time)
** Execute assets:precompile
/usr/local/rbenv/versions/1.9.3-p362/bin/ruby /usr/local/rbenv/versions/1.9.3-p362/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace
** Invoke assets:precompile:all (first_time)
** Execute assets:precompile:all
** Invoke assets:precompile:primary (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:primary
rake aborted!
Command failed with status (): [/usr/local/rbenv/versions/1.9.3-p362/bin/r...]
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:53:in `block in create_shell_runner'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:45:in `call'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:45:in `sh'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils_ext.rb:39:in `sh'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:80:in `ruby'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils_ext.rb:39:in `ruby'
/home/app/application/ruby/1.9.1/gems/actionpack-3.2.12/lib/sprockets/assets.rake:12:in `ruby_rake_task'
/home/app/application/ruby/1.9.1/gems/actionpack-3.2.12/lib/sprockets/assets.rake:21:in `invoke_or_reboot_rake_task'
/home/app/application/ruby/1.9.1/gems/actionpack-3.2.12/lib/sprockets/assets.rake:29:in …Run Code Online (Sandbox Code Playgroud) 我一直在拔头发.我一直与资产管道关系不好,总是给我带来麻烦......今天又来了......
当我尝试在本地编译我的资产时,一切都很好:
$ RAILS_ENV=production rake assets:precompile --trace
Run Code Online (Sandbox Code Playgroud)
但是当我与Capistrano一起部署时:
cd /var/www/xxx/releases/20140717164232 && ( RAILS_ENV=production bundle exec rake assets:precompile )
Run Code Online (Sandbox Code Playgroud)
它崩溃时出现以下错误:
rake aborted!
NoMethodError: undefined method `[]' for nil:NilClass
(in /var/www/xxx/releases/20140717164232/app/assets/stylesheets/application-sign-in.css)
/var/www/xxx/shared/bundle/ruby/2.1.0/gems/sprockets-2.11.0/lib/sprockets/sass_functions.rb:63:in `sprockets_context'
Run Code Online (Sandbox Code Playgroud)
我真的不知道如何调试这个..本地我无法重现它,在我的服务器上错误只是没有指向我任何地方..
我已经搜索了这个错误并尝试了几件事,但没有任何帮助.有人说通过更新来消除错误..或者通过在sass-rails gem之前添加sprockets gem.
我的项目设置如下:带有宝石的常规rails 4 app,其中包含代表模板的资产.我使用以下行来确保编译所有内容:
config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif *.css *.js *.eot *.woff *.ttf *.svg)
Run Code Online (Sandbox Code Playgroud)
谁知道如何解决这个问题,或者如何调试它?
编辑
删除所有asset-url()助手似乎工作..但再次,没有线索为什么..
asset-pipeline ×10
ruby ×3
sprockets ×2
asset-sync ×1
css ×1
ember.js ×1
javascript ×1
js-routes ×1
rake ×1
rubygems ×1
sass ×1