对不起,如果这是一个简单问题的冗长积累,但我想清楚我的想法.
我现在已经在几个项目中使用了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中使用了资产助手(在我找到的几个堆栈溢出答案中引用资源的方式被引用,但是在回形针中使用带有插值选项的资产路径助手也将回退到公众,因为未插入的资产名称显然不会被发现为现有文件.
我以前曾多次使用asset_sync gem取得了巨大成功,但在Rails 4.0.3项目中使用它似乎导致了问题.
资产被上传,散列和gzip到目标目录(我只使用默认的'assets'),但是当在临时/生产环境中运行应用程序时,路径不正确.
他们采取以下形式:
S3_DOMAIN.com/stylesheets/application.css
Run Code Online (Sandbox Code Playgroud)
代替:
S3_DOMAIN.com/assets/application-HASH.css
Run Code Online (Sandbox Code Playgroud)
还有其他人遇到过这个问题吗?我发现反转此行为的唯一方法是将config.assets.compile设置为true,但这在生产环境中不起作用.
以下是相关的配置文件:
## environments/staging.rb
config.serve_static_assets = false
config.assets.compress = true
config.assets.js_compressor = :uglifier
config.assets.css_compressor = :sass
# Have to set this to true to make asset_sync generate the correct links
config.assets.compile = false
config.assets.digest = true
config.assets.enabled = true
config.assets.initialize_on_precompile = true
config.action_controller.asset_host = "//#{Figaro.env.fog_directory}.s3.amazonaws.com"
config.action_mailer.asset_host = "//#{Figaro.env.fog_directory}.s3.amazonaws.com"
config.assets.prefix = "/assets"
config.assets.debug = false
config.assets.cache_store = :memory_store
##config/asset_sync.yml
defaults: &defaults
fog_provider: 'AWS'
aws_access_key_id: "<%= ENV['AWS_ACCESS_KEY_ID'] %>"
aws_secret_access_key: "<%= ENV['AWS_SECRET_ACCESS_KEY'] %>"
# To …Run Code Online (Sandbox Code Playgroud) ruby ruby-on-rails asset-pipeline ruby-on-rails-4 asset-sync
asset_sync gem error :(
我开始的第一个错误与unfgem有关,所以我添加gem "unf", "~> 0.1.3"到我的gemfile并再次尝试.没有运气:(经过更多研究后,我可能会遇到与我的aws桶相关的其他设置的问题.我的dns是通过route53托管的,我想使用自定义域来提供我的资产.这意味着我的桶看起来不像assets.domain.com只是一个简单的名称.当我尝试运行rake assets:precompile它rake aborted!
hostname "assets.domain.com.s3-us-west-1.amazonaws.com" does not match the server certificate (OpenSSL::SSL::SSLError)"时会出现错误但是错误似乎是错误的.为了使用你自己的子域即资产.我读到桶必须设置为静态网站.这意味着网址看起来assets.domain.com.s3-website-us-west-1.amazonaws.com似乎与错误代码不匹配.
我在这里错过了一个设置吗?也许我很疯狂...谢谢你的帮助.
我的production.rb设置
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
AssetSync.config.run_on_precompile = true
config.action_controller.asset_host = "http://assets.domain.com"
config.assets.prefix = "/data"
config.assets.enabled = true
config.assets.compile = true
config.assets.initialize_on_precompile = true
# Generate digests for assets URLs.
config.assets.digest = true
Run Code Online (Sandbox Code Playgroud)
我当前的初始化文件:
if defined?(AssetSync)
AssetSync.configure do |config|
config.fog_provider = …Run Code Online (Sandbox Code Playgroud) 我使用这些宝石使用AngularJS进行Rails 4应用程序:
它适用于这样的模板:
<img ng-controller='LikePostController'
ng-dblclick='like(post);'
ng-src='{{post.photo.standard}}'
class='lazy post_photo pt_animate_heart'
id='post_{{post.id}}_image'
/>
Run Code Online (Sandbox Code Playgroud)
图像渲染正确.但是在我的其他js
petto.directive('ptAnimateHeart', ['Helper', function(Helper){
linkFunc = function(scope, element, attributes) {
$heartIcon = $("#heart_icon");
if($heartIcon.length == 0) {
$heartIcon = $("<img id='heart_icon' src='/assets/feed.icon.heart.png' alt='Like' /> ");
$(document.body).append($heartIcon);
}
element.on('dblclick', function(event){
$animateObj = $(this);
Helper.animateHeart($animateObj);
});
}
return {
restrict: 'C',
link: linkFunc
}
}])
Run Code Online (Sandbox Code Playgroud)
我从浏览器控制台找不到'assets/feed.icon.heart.png'错误.我在app/assets/feed.icon.heart.png下有feed.icon.heart.png.
ps:忘记提及我使用资产同步gem来托管亚马逊s3中的资产.图像在开发中运行良好,但在生产中没有.