使用RoR 4.1.4
我正在尝试使用leaflet-rails gem。我按照github页面中列出的步骤进行操作,但是当我尝试加载地图时,我看到了
ReferenceError: L is not defined
在浏览器控制台中。这显然意味着正在加载和执行gem中的帮助程序,但它无法找到leaflet.js
文件。
但是,页面的头部显示/assets/leaflet.js
正在被引用,它实际上就在那里。
当我查看生成的代码时:
<div id="map"></div>
<script>
var map = L.map('map')
map.setView([-54.0, 6.08], 16)
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
maxZoom: 18,
subdomains: '',
}).addTo(map)
</script>
</div>
<script src="/assets/jquery.js?body=1" data-turbolinks-track="true"></script>
<!-- all the other scripts loaded -->
<script src="/assets/exif.js?body=1" data-turbolinks-track="true"></script>
<script src="/assets/leaflet.js?body=1" data-turbolinks-track="true"></script>
<!-- some more scripts -->
因此gem在map div下面添加了一个脚本,然后,由于sprockets机制和所有这些,所以加载了其他脚本。对我来说,这看起来很明显,脚本不能加载leaflet.js,因为它后来被引用!
所以......我误解了RoR如何处理宝石和javascripts?它一定是在某个时候起作用的......
这是我的/app/assets/javascript/application.js:
//= require jquery
//= require jquery.ui.widget
// Here I load a whole bunch of javascripts which are related to jquery-fileupload, cut for brevity
//= require bootstrap.min
//= require bootbox.min
//= require bootstrap-datepicker
//= require exif
//= require leaflet
//= require turbolinks
//= require_tree .
事实证明这可能是一些特定于RoR的问题。
许多网站建议把
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
在文件的END处加载javascripts的行,以加快页面显示。使用leaflet-rails
宝石,这不是很好,并将产生上述问题。如果在<head>
部分放置相同的行,问题就会消失......
附:我仍然有宝石的问题,现在我得到了
Error: No value provided for variable {s}
如果我用“http://{s}.tile.osm.org/{z}/{x}/{y}.png
”代替“http://a.tile.osm.org/{z}/{x}/{y}.png"
”它的确有效......不要认为它的意思是那样工作......但这是一个不同的问题......
我在rails中遇到了同样的问题。
Can't find variable L
处于生产模式以下步骤没有帮助。
asset "leaflet"
(Bowerfile)//= require leaflet/dist/leaflet.js
(application.js)*= require leaflet/dist/leaflet.css
(application.css)Rails.application.config.assets.precompile += ['leaflet/dist/leaflet.js', 'leaflet/dist/leaflet.css']
public/assets/...
我还缺少什么吗?
[解]
可以使用http://leafletjs.com/examples/quick-start/上的传单推荐的CDN资产来解决此问题
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
但是,我更愿意使用捆绑在我的应用服务器上的本地缓存预编译资产,而不是依赖公共CDN,网络带宽和更多外部事物。
不知道你是否能够解决你的问题。对我来说,我忘了跑:
rake assets:precompile
在部署到生产之前。