Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可以在coffee脚本资产文件中解析Ruby实例变量吗?_Javascript_Ruby On Rails_Coffeescript - Fatal编程技术网

Javascript 可以在coffee脚本资产文件中解析Ruby实例变量吗?

Javascript 可以在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

我正试图将实例变量从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
  @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。我建议使用这样的库来处理您正在考虑的用例:

这加上HTML5
data-*
标记将帮助您在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。我建议使用这样的库来处理您正在考虑的用例:

这加上HTML5
data-*
标记将帮助您在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') %>"