Javascript 可以在coffee脚本资产文件中解析Ruby实例变量吗?
我正试图将实例变量从rails应用程序传递到关联的coffeescript文件,但它目前似乎没有解析。我错过了什么 locations.js.coffee.erbJavascript 可以在coffee脚本资产文件中解析Ruby实例变量吗?,javascript,ruby-on-rails,coffeescript,Javascript,Ruby On Rails,Coffeescript,我正试图将实例变量从rails应用程序传递到关联的coffeescript文件,但它目前似乎没有解析。我错过了什么 locations.js.coffee.erb $.ajax url: "/map_groups/<%= @id %>.json" type: "get" dataType: "json" async: false success: (response) -> exports.response = response def index
$.ajax
url: "/map_groups/<%= @id %>.json"
type: "get"
dataType: "json"
async: false
success: (response) ->
exports.response = response
def index
@id = (params[:id]) ? params[:id] : 1
@locations = Location.all
end
但这是控制台中显示的错误:
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:3000/map_groups/.json
我可以做些什么来解析实例变量吗
注意:
我知道变量存在,因为它正在传递给视图
编辑:我正在尝试做什么
我的大部分数据都是通过JSON发送的,为了让coffeescript知道要提取什么JSON数据,我创建了一个自定义路由:
get "/locations/map-group/:id", controller: :locations, action: :index, as: :map_group
如果您再次参考我的控制器-您将看到,如果用户访问纯旧的/位置
,则ID默认为1。否则,id是URL中指定的任何内容。coffeescript文件需要通过AJAX调用提取与该ID相关的数据。我怎样才能告诉咖啡脚本这个ID是什么?我会怎么做
如果可以避免的话,我强烈建议不要使用Ruby实例变量来生成CoffeeScript。我建议使用这样的库来处理您正在考虑的用例:
这加上HTML5data-*
标记将帮助您在JavaScript中传递所需的标识信息:
例如:
<div id="my_awesome_location" data-location-id="<%= @location.id %>">...</div>
怎么做呢
但是,如果您必须在CoffeeScript中使用ERB样式的标记,则可以使用coffee.ERB
文件扩展名:
2.3.3 JavaScript/CoffeeScript和ERB
如果将erb扩展添加到JavaScript资产中,使其成为application.js.erb,则可以在JavaScript代码中使用asset_path helper:
$(“#徽标”).attr({
src:“
});
这将写入被引用的特定资产的路径
类似地,您可以在具有erb扩展名的CoffeeScript文件(例如application.js.coffee.erb)中使用asset_路径帮助器:
$(“#徽标”).attr src:“
为什么你可能不想那样做
我建议使用上述库而不是直接ERB的原因是控制器/视图和资源之间的紧密耦合
这还意味着,在进行资产编译之前,您必须预先加载整个who应用程序,因此,如果您试图部署到Heroku这样的PaaS上,您将受到影响
在slug编译过程中,应用程序的配置变量在环境中不可用。因为必须加载应用程序才能运行assets:precompile任务,所以任何需要存在配置变量的初始化代码都应该优雅地处理nil情况
基本上,如果你稍微改变一下你的控制器,你就有可能破坏你的资产。最好将它们作为单独的单元,并引入一个中介层来处理您试图解决的问题。我会怎么做
如果可以避免的话,我强烈建议不要使用Ruby实例变量来生成CoffeeScript。我建议使用这样的库来处理您正在考虑的用例:
这加上HTML5data-*
标记将帮助您在JavaScript中传递所需的标识信息:
例如:
<div id="my_awesome_location" data-location-id="<%= @location.id %>">...</div>
怎么做呢
但是,如果您必须在CoffeeScript中使用ERB样式的标记,则可以使用coffee.ERB
文件扩展名:
2.3.3 JavaScript/CoffeeScript和ERB
如果将erb扩展添加到JavaScript资产中,使其成为application.js.erb,则可以在JavaScript代码中使用asset_path helper:
$(“#徽标”).attr({
src:“
});
这将写入被引用的特定资产的路径
类似地,您可以在具有erb扩展名的CoffeeScript文件(例如application.js.coffee.erb)中使用asset_路径帮助器:
$(“#徽标”).attr src:“
为什么你可能不想那样做
我建议使用上述库而不是直接ERB的原因是控制器/视图和资源之间的紧密耦合
这还意味着,在进行资产编译之前,您必须预先加载整个who应用程序,因此,如果您试图部署到Heroku这样的PaaS上,您将受到影响
在slug编译过程中,应用程序的配置变量在环境中不可用。因为必须加载应用程序才能运行assets:precompile任务,所以任何需要存在配置变量的初始化代码都应该优雅地处理nil情况
基本上,如果你稍微改变一下你的控制器,你就有可能破坏你的资产。最好将它们作为单独的单元,并引入一个中介层来处理您试图解决的问题。正如Farley Knight所说,您可以,但出于他所述的原因,请不要这样做 对我最有效的方法是在ERB文件中隐藏数据字段。然后,因为您使用的是JQuery,所以只需在url中使用
idField.val()
来调用$.ajax
希望这能有所帮助。正如法利·奈特所说,是的,你可以,但出于他所说的原因,请不要这样做 对我最有效的方法是在ERB文件中隐藏数据字段。然后,因为您使用的是JQuery,所以只需在url中使用
idField.val()
来调用$.ajax
希望这会有所帮助。在使用AJAX时,IMO最好的方法是将JSON对象打印到页面并在JavaScript中使用,而不是将代码内联。但不确定问题是什么……只将内容作为数据传递。通过JSON。从数据中构建更复杂的东西。@PaulS。这就是我正在做的,但我需要从URL中提取coffeescript的JSON文件ID。@anwya
id = $("#my_awesome_location").data('location-id')
$.ajax
url: Routes.map_group_path(id) #=> "/map_groups/#{id}.json"
type: "get"
dataType: "json"
...
$('#logo').attr({
src: "<%= asset_path('logo.png') %>"
});
$('#logo').attr src: "<%= asset_path('logo.png') %>"