Ruby on rails AngularJS指令和模板中的Rails图像资源

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_

我有一个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_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