预编译文件不能正常工作

Posted

技术标签:

【中文标题】预编译文件不能正常工作【英文标题】:Precomopiling files doesnt work fine 【发布时间】:2013-12-13 22:05:54 【问题描述】:

我正在使用 Leaflet.js 开发项目。我有 javascript 文件必须更新公司的坐标。因此,当我在开发 ENV 并且 rails 使用 map_update.coffee.erb 时,一切都很顺利。一旦我尝试制作 rake assets:precompile 并在生产环境中启动我的本地服务器,map 就会损坏。它可以工作,但与开发环境完全不同。

我的 js 文件是预编译的(我可以在 public/assets/map 中看到它),因为我在 production.rb 中明确地预编译了它。但效果不好。

任何想法都会很棒!如果你需要我的一些文件,只要问我,我会提供我写的所需代码。谢谢!

编辑 生产.rb:

Application.configure do

  config.cache_classes = true
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.serve_static_assets = false

  config.assets.compress = true
  config.assets.compile = false
  config.assets.digest = true

  require 'syslog/logger'
  config.logger = Syslog::Logger.new 'abw'
  config.logger.level = 2

  config.assets.precompile += %w( application-ie.css application-ie.js )
  config.assets.precompile += %w( abwp.css.scss abwp.css xgemius.js )
  config.assets.precompile += %w( map/map.js map/map_update.js )

  config.i18n.fallbacks = true

  config.active_support.deprecation = :notify
end

map_update.coffee.erb 在开发环境中工作,但在预编译后不在生产环境中:

#= require map/map.coffee.erb

jQuery $ ->
  coord = $('#coordinates-val').val().replace('[',"").replace(']',"").split(",").map(Number)
  loc = [coord[1], coord[0]]
  map.setCompanyLocation loc
  map.layers.companyLocationMarker.on 'dragend', (e) ->
    $('#coordinates-val').val(e.target._latlng.lng + ", " + e.target._latlng.lat)

  $("#location-detector-update").on 'click', (e) ->
    e.preventDefault()
    address = $("#location-address").val()
    errorElement = $("#location-error")
    if address.length > 0
      $.ajax
        url: 'http://geocode-maps.yandex.ru/1.x/'
        type: 'get'
        data:
          geocode: address
          format: 'json'
          results: 1
         ,success: (data) =>
          if typeof(data) == 'string'
            data = JSON.parse(data)
          if data.response.GeoObjectCollection.featureMember.length > 0
            _location =   data.response.GeoObjectCollection.featureMember[0].GeoObject.Point.pos.split(" ")
            _location[0] = 0 if _location[0] == null
            _location[1] = 0 if _location[1] == null
            location = new L.LatLng(_location[1], _location[0])
            map.setCompanyLocation location
            $('#coordinates-val').val(_location[0] + ", " + _location[1])
            map.layers.companyLocationMarker.on 'dragend', (e) ->
              $('#coordinates-val').val(e.target._latlng.lng + ", " + e.target._latlng.lat)
            errorElement.html ""
          else
            errorElement.html "Не найдено"

“不起作用”的意思是,当我在运行 dev env 时更新坐标的页面上时,一切都按我预期的那样工作:如果公司有坐标,它会显示它们并有机会输入地址和帖子另一个与分贝​​协调。如果公司没有坐标,地图正在自定义的默认位置初始化。在生产环境中,我只看到标记,没有地图图片。仍然可以输入地址查找坐标并将其发布到数据库,但我看不到地图本身,因此无法将标记移动到正确的位置。啊,忘记了。导管视图:

#map
.map-filter
  #location-error
  .input-append.adress-input
    = text_field_tag 'location-address', nil, class: 'input', placeholder: 'Enter your adress'
    = link_to nil, class: 'btn', id: 'location-detector-update' do
      i.icon-search

= javascript_include_tag 'map/map_update'

= render 'form_coordinates' 

希望这已经足够开始了。

还有一件事。我有另一种观点,只是为了看公司的地图,我可以做到。所以地图正在正确初始化。我很伤心,我的 map_update.coffee.erb 的预编译问题

【问题讨论】:

但效果不好。太糟糕了。在没有代码和对问题的清晰描述的情况下,您究竟希望有人在这方面提供帮助吗? 似乎问题出在预编译中,而不是在我的 js 文件中。如果您需要一些特定的代码,例如我的 production.rb,我可以提供。我不给出任何代码,因为我不知道为什么js可以在dev中工作而不能在生产中工作。所以告诉我你需要什么代码,你会得到的。 看看你的问题,问问自己如果有人问这个问题,你会从哪里开始,没有额外的信息。跨度> 如果您需要,请随时询问其他问题 【参考方案1】:

所以,我终于找到了问题所在。

我需要在我的 update_map.js map.js 中,它有自己的 window.map 实例化。它不适合这种更改标记的情况。我重写了我的 update_map.js,现在它正在使用它自己的 window.map 实例。这是我的 update_map.js:

ACTIVEOBJECTICON = L.icon
  iconUrl: '<%= image_path("green-marker.png") %>',
  iconSize: [25, 41],
  iconAnchor: [13, 41]
  draggable: true

class EditMap extends L.Map
  constructor: (id, params) ->
    super id, params
    @layers =
      companyLocationMarker: new L.LayerGroup()
      activeObjectMarker: new L.LayerGroup()
    @activeObjectIcon = ACTIVEOBJECTICON
    @putInit()

  putInit: =>
    if coord == "[0]" || coord == ""
      alert("You didn't setup adress.")
    else
      latLng = coord.replace('[',"").replace(']',"").split(",").map(Number)
      val1 = latLng[1]
      val0 = latLng[0]
      location = new L.LatLng(val1, val0)
      @layers.activeObjectMarker = new L.Marker(location,  icon: @activeObjectIcon )
      @addLayer(@layers.activeObjectMarker)
      @layers.activeObjectMarker.dragging.enable()
      @setView(location, 15)
    @panTo location

  setCompanyLocation: (location) =>
    @currentLocation = location
    map.renderCompanyLocation()

  renderCompanyLocation: =>
    locationIcon = ACTIVEOBJECTICON
    @removeLayer(@layers.activeObjectMarker)
    @removeLayer(@layers.companyLocationMarker)
    @layers.companyLocationMarker = new L.Marker(@currentLocation,  icon: locationIcon )
    @addLayer(@layers.companyLocationMarker)
    @layers.companyLocationMarker.dragging.enable()
    @setView(@currentLocation, 15)


jQuery $ ->
  osmUrl = 'http://s.tile.openstreetmap.org/z/x/y.png'
  osmTiles = new L.TileLayer osmUrl,
    maxZoom: 18
  window.map = new EditMap 'map',
    attributionControl: false,
    zoom: 12,
    doubleClickZoom: false
    center: new L.LatLng(53.9060, 27.5549)
  map.addLayer osmTiles

  $("#location-detector-update").on 'click', (e) ->
    e.preventDefault()
    address = $("#location-address").val()
    errorElement = $("#location-error")
    if address.length > 0
      $.ajax
        url: 'http://geocode-maps.yandex.ru/1.x/'
        type: 'get'
        data:
          geocode: address
          format: 'json'
          results: 1
        ,success: (data) =>
          if typeof(data) == 'string'
            data = JSON.parse(data)
          if data.response.GeoObjectCollection.featureMember.length > 0
            _location = data.response.GeoObjectCollection.featureMember[0].GeoObject.Point.pos.split(" ")
            _location[0] = 0 if _location[0] == null
            _location[1] = 0 if _location[1] == null
            location = new L.LatLng(_location[1], _location[0])
            map.setCompanyLocation location
            $('#coordinates-val').val(_location[0] + ", " + _location[1])
            map.layers.companyLocationMarker.on 'dragend', (e) ->
              $('#coordinates-val').val(e.target._latlng.lng + ", " + e.target._latlng.lat)
            errorElement.html ""
          else
            errorElement.html "Unable to find"

production.rb 是一样的。

【讨论】:

以上是关于预编译文件不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 Cheetah 中预编译基本模板,以便 #include、#extends 和 #import 在 Weby 中正常工作

为啥我不能在 Visual Studio 中禁用预编译头文件?

具有扩展名 .woff 的 Rails 5 字体文件不能在 AWS EB 中进行预编译

GCC 和预编译头文件

KEIL生成预编译文件

预编译标头 IntelliSense 错误