Ruby on rails AngularJS指令和模板中的Rails图像资源
我有一个Rails 4应用程序,其中AngularJS使用了以下gems:Ruby on rails AngularJS指令和模板中的Rails图像资源,ruby-on-rails,angularjs,asset-sync,Ruby On Rails,Angularjs,Asset Sync,我有一个Rails 4应用程序,其中AngularJS使用了以下gems: 宝石“angularjs轨道” gem“角度轨道模板” gem“资产同步” 使用这样的模板时效果非常好: <img ng-controller='LikePostController' ng-dblclick='like(post);' ng-src='{{post.photo.standard}}' class='lazy post_photo pt_
- 宝石“angularjs轨道”
- gem“角度轨道模板”
- gem“资产同步”
<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'
/>
图像渲染正确。但是在我的另一个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
}
}])
petto.directive('ptanimatehart',['Helper',函数(Helper){
linkFunc=函数(范围、元素、属性){
$heartIcon=$(“#heartIcon”);
如果($heartIcon.length==0){
$heartIcon=$(“”);
$(document.body).append($heartIcon);
}
on('dblclick',函数(事件){
$animateObj=$(此);
Helper.animateHeart($animateObj);
});
}
返回{
限制:“C”,
链接:linkFunc
}
}])
我在浏览器控制台中找到“assets/feed.icon.heart.png”错误。我在app/assets/feed.icon.heart.png下找到了feed.icon.heart.png
ps:忘了提到我在AmazonS3中使用assets sync gem托管资产。映像在开发过程中运行良好,但在生产过程中不起作用。硬编码的资产链接仅在开发过程中起作用,因为在生产过程中,资产会被预编译。这意味着,除其他事项外,文件名将从:
my_image.png
类似于这样的内容(它添加了唯一的md5哈希):
“my_image-231a680f23887d9dd70710ea5efd3c62.png”
试试这个:
将javascript文件扩展名更改为:yourjsfile.js.erb
以及以下链接:
$heartIcon=$(“'alt='Like'/>”)代码>
为了更好地理解硬编码的资产链接只在开发中起作用,因为在生产中资产是预编译的。这意味着,除其他事项外,文件名将从:
my_image.png
类似于这样的内容(它添加了唯一的md5哈希):
“my_image-231a680f23887d9dd70710ea5efd3c62.png”
试试这个:
将javascript文件扩展名更改为:yourjsfile.js.erb
以及以下链接:
$heartIcon=$(“'alt='Like'/>”)代码>
为了更好地理解您可以在助手中的某个地方定义以下方法,例如在app/helpers/application\u helper.rb
中:
def列表图像资源(目录名称)
path=File.expand_path(“../../../app/assets/images/#{dir_name}”,_u文件uu)
完整路径=Dir.glob“#{path}/**”
资产映射={}
完整路径。每个do | p|
原始名称=File.basename p
asset_path=asset_path p[p.index(“#{dir_name}”)…-1]
资产映射[原始名称]=资产路径
结束
资产映射到json
结束
您可以修改该方法以处理您想要的任何资产,而不仅仅是位于app/assets/images
子目录中的资产。该方法将返回一个映射,其中所有原始资产名称作为键,它们的“编译”名称作为值
返回的贴图可以通过ng init
传递给任何角度控制器(一般不建议,但在这种情况下适用):
要使资源在角度上真正可用,请在控制器中定义一个新的$scope
有效:
$scope.$watch('assets',function(value){
如果(值){
$scope.assets=JSON.parse(值);
}
});
在$scope
中有了它,就可以像往常一样在ng src
指令中使用资产名称,并且在预编译过程后不会停止
您可以在助手中的某个位置定义以下方法,例如在app/helpers/application\u helper.rb
:
def列表图像资源(目录名称)
path=File.expand_path(“../../../app/assets/images/#{dir_name}”,_u文件uu)
完整路径=Dir.glob“#{path}/**”
资产映射={}
完整路径。每个do | p|
原始名称=File.basename p
asset_path=asset_path p[p.index(“#{dir_name}”)…-1]
资产映射[原始名称]=资产路径
结束
资产映射到json
结束
您可以修改该方法以处理您想要的任何资产,而不仅仅是位于app/assets/images
子目录中的资产。该方法将返回一个映射,其中所有原始资产名称作为键,它们的“编译”名称作为值
返回的贴图可以通过ng init
传递给任何角度控制器(一般不建议,但在这种情况下适用):
要使资源在角度上真正可用,请在控制器中定义一个新的$scope
有效:
$scope.$watch('assets',function(value){
如果(值){
$scope.assets=JSON.parse(值);
}
});
在$scope
中有了它,就可以像往常一样在ng src
指令中使用资产名称,并且在预编译过程后不会停止
只需执行以下操作:
app.run(function($rootScope,$location){
$rootScope.auth_url = "http://localhost:3000"
$rootScope.image_url = $rootScope.auth_url + "/uploads/user/image/"
});
在控制器中为$rootScope
在视野中
<img ng-src="{{user.image.url}}" width="100px" height="100px">
注意:它在Rails API中工作得很好,它假设您有可用的用户对象,以便它可以在/uploads/image/
目录中指定正确的映像,只需执行以下操作:
app.run(function($rootScope,$location){
$rootScope.auth_url = "http://localhost:3000"
$rootScope.image_url = $rootScope.auth_url + "/uploads/user/image/"
});
在控制器中为$rootScope
在视野中
<img ng-src="{{user.image.url}}" width="100px" height="100px">
注意:它在Rails API中工作得很好,它假设您有可用的用户对象,以便它可以在/uploads/image/
目录中指定正确的映像在循环中如何执行此操作?图像url在javascript插值中不起作用。你可以使用gon gem:它帮助了我。唯一需要提及的是:我需要使用image\u url
,而不是imge url
,我使用的是Rails 4.2.6,在循环中如何做到这一点?图像url在javascript插值中不起作用。您可以使用gon gem:It help