Rails 4和Leaflet:找不到资产/图像?

时间:2013-07-21 15:10:54

标签: ruby-on-rails leaflet asset-pipeline

我遇到的问题确实不应该是问题。出于某种原因,我在app / assets / images中的图像不可访问。当我要求他们时,我得到一个404.

./log/development.log:Started GET "/assets/images/marker-shadow.png" for 127.0.0.1 at 2013-07-20 22:02:38 -0400
./log/development.log:ActionController::RoutingError (No route matches [GET] "/assets/images/marker-shadow.png"):

mike@sleepycat:~/projects/myapp$ ls app/assets/images/
marker-icon-2x.png  marker-icon.png  marker-shadow.png

这真的应该是一个简单的脑死亡修复...最多重启服务器。 我已经重新启动了服务器,我检查了文件权限,以确保文件对它们具有合理的权限......当我加载页面时,我仍然得到404。

我在这里缺少什么?

使用Rails 4。

7 个答案:

答案 0 :(得分:17)

只需使用此助手获取您的图片:

image_path('marker-shadow.png')

rails生成的路径为“/assets/marker-shadow.png”而没有“images”文件夹。

答案 1 :(得分:7)

您可以使用直接路径

访问app/assets/images/文件夹中的所有内容
'/assets/marker-icon-2x.png'
...

有资产助手可以在erb中使用它:

asset_path('marker-icon-2x.png')

对于scss中的图像,它变为:

image-path('marker-icon-2x.png')

因为文件夹app/assets/[images||stylesheets||javascripts]映射为一个文件夹/assets asset pipeline framework

请注意,助手image_tag('marker-icon-2x.png')“知道”图像已经在哪里

答案 2 :(得分:3)

我已将网址作为数据属性添加到#map元素,这里来自我的模板:

#map data-marker-url=asset_path('leaflet/marker-icon.png') data-marker-2x-url=asset_path('leaflet/marker-icon-2x.png') data-marker-shadow-url=asset_path('leaflet/marker-shadow.png')

然后我在设置标记时访问这些值(latitude& longitude也是数据属性,但为了简洁,我跳过了这一点)

$map = $('#map')
L.marker(
  [latitude, longitude],
  icon: new L.Icon({
    iconUrl: $map.data('marker-url'),
    retinaUrl: $map.data('marker-2x-url'),
    shadowUrl: $map.data('marker-shadow-url'),
    iconSize: [25, 41],
    iconAnchor: [12, 41],
    popupAnchor: [1, -34],
    shadowSize: [41, 41] 
  })  
).addTo(map)

最后4个属性为图像设置了一些元数据,否则图像中心将设置为该位置而不是标记的尖端。这些值是传单0.6.4的默认值。

您也可以通过erb或其他内容发送您的javascript,而不是数据属性,但我更喜欢这样。

答案 3 :(得分:3)

这是因为Leaflet试图猜测图像路径。但是初始化代码中的you can set the default marker images path,如下所示:

L.Icon.Default.imagePath = 'path-to-your-leaflet-images-folder';
// your other Leaflet code

所以在你的情况下,它将是:

L.Icon.Default.imagePath = '/assets'

但是这种方法存在问题,它不适用于消化图像。因此,最好使用自定义Icon并使用rails helper设置网址:

digested_icon = L.icon({
  iconUrl: "<%= asset_path 'marker-icon.png' %>"
  iconRetinaUrl: "<%= asset_path 'marker-icon-2x.png' %>"
  shadowUrl: "<%= asset_path 'marker-shadow.png' %>"
})

然后,只要添加新标记,就会指定此自定义图标:

L.marker([45.5, -10.9], {icon: digested_icon})

请记住将.erb扩展名添加到您的coffee / js文件中,以便帮助程序正常工作。

答案 4 :(得分:2)

如果要在视图中显示图像,则必须将image_path与 image_tag 结合使用。 image_path()仅返回图像文件的路径名。所以,你会这样做:

image_tag image_path('your_image.png')

答案 5 :(得分:2)

我使用DropZone.js时遇到了同样的问题。我没有使用庞大的DropZone文件搞乱,而是在/ public命名&#39; images&#39;中创建了一个文件夹。并将我的精灵图像放在那里。这就是DropZone期待它们的地方,也是我获得404&#39; 404的原因。精灵图像的未找到错误。

答案 6 :(得分:1)

我发现如果您刚刚添加了/ app / assets / images文件夹,则在您重新启动应用程序之前,链接器将无法找到它。