【问题标题】:erb won't render in coffeescript fileerb 不会在咖啡脚本文件中呈现
【发布时间】:2011-12-18 21:37:11
【问题描述】:

我无法弄清楚为什么我们的 ruby​​ 代码没有在 coffeescript 中呈现。最终,我们正在努力在谷歌地图视图中绘制一系列存储在 Rails 模型中的标记。因为我们遇到了循环问题,所以我们尝试获取一个测试变量以在警报中呈现;它不工作。弹出警报,但它只说 Hello,而不是 Hello 5(或 Hello "5" ?)

这是我们的咖啡脚本文件 (locations.coffee.erb)

$ ->
    alert "Hello <%= @test %>"
    latlng = new google.maps.LatLng(43.0, -107.0);
    myOptions =
        zoom: 5,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    point = new google.maps.LatLng(43.0, -107.0);
    marker = new google.maps.Marker({
        position: point,
        map: map,
        title: "Test",
    });

@test 在#map 中定义,位于locations_controller.rb 的底部:

class LocationsController < ApplicationController

    def show
        @traveling_party = TravelingParty.find_by_id(session[:party])
        @location = Location.where("position >= #{@traveling_party.position}").order("position ASC").first
    end

    def move
        f = params[:traveling_party]

        @traveling_party = TravelingParty.find(f["id"])
        @traveling_party.speed = f["speed"].to_i
        @traveling_party.ration = f["ration"].to_i

        @location = Location.where("position > #{@traveling_party.position}").order("position ASC").first

        @traveling_party.position += @traveling_party.speed
        if @traveling_party.position > @location.position 
            @traveling_party.position = @location.position
        end

        food_eaten = @traveling_party.ration * @traveling_party.people
        Item.where({:trader_id => @traveling_party.id, :type => "Food"}).limit(food_eaten).destroy_all()

        if @traveling_party.save()
            flash[:notice] = "Successfully updated traveling party."
            redirect_to '/play/'
        else
            flash[:error] = "Transaction could not be completed."
            redirect_to '/play/'
        end
    end

    def map
        @traveling_party = TravelingParty.find_by_id(session[:party])
        @locations = Location.all
        @test = "5"
    end

end

我觉得奇怪的是 @test 在我们的 map.html.erb 视图中正确呈现。不出所料,地图上方印有 5:

<% @locations.each do |loc| %>

<% end %>

<div id="map_canvas">Random</div>

【问题讨论】:

  • 您的locations.coffee.erb 文件在哪里?如果它在assets 中,那么它只会被处理一次,并且此时不会包含您当前请求的上下文......所以您的 ERB 对您的推断知之甚少。
  • @Romain -locations.coffee.erb 在 assets/javascripts 中。如果我们将 javascript 放在 map.html.erb 中并完全摆脱 locations.coffee.erb,我们会解决这个问题吗?
  • @apneadiving - 看起来它确实可以解决我们的问题......虽然我是 Rails 新手,所以从头开始编写它可能比使用 gem 更容易
  • @jmaliakal 您可能会通过使用 gems 而不是尝试从头开始编写来节省一些理智。并回答你的问题 - 是的,它会解决你的问题,但它会被认为是不好的做法。

标签: ruby-on-rails coffeescript erb


【解决方案1】:

该文件确实通过 ERB 运行,但只有一次 - 当应用程序正在预编译资产时。这不是你可以很容易改变的东西,你可能不应该尝试。

您可以改为通过 AJAX JSON 请求获取您想要单独填充的实际数据,或者将其作为 Javascript 嵌入到您的页面模板中。

静态 (CSS + JS) 文件的 ERB 编译通常用于放入不会随每次请求而改变的环境特定数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2014-10-20
    • 2017-10-01
    • 1970-01-01
    • 2018-01-25
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多