我会做什么
如果可以避免的话,我强烈建议不要使用 Ruby 实例变量来生成 CoffeeScript。我建议使用这样的库来处理您正在考虑的用例:
https://github.com/railsware/js-routes
# Configuration above will create a nice javascript file with Routes object that has all the rails routes available:
Routes.users_path() // => "/users"
Routes.user_path(1) // => "/users/1"
Routes.user_path(1, {format: 'json'}) // => "/users/1.json"
Routes.new_user_project_path(1, {format: 'json'}) // => "/users/1/projects/new.json"
Routes.user_project_path(1,2, {q: 'hello', custom: true}) // => "/users/1/projects/2?q=hello&custom=true"
Routes.user_project_path(1,2, {hello: ['world', 'mars']}) // => "/users/1/projects/2?hello%5B%5D=world&hello%5B%5D=mars"
这加上 HTML5data-*
标记将帮助您在 JavaScript 中传递所需的识别信息:
http://html5doctor.com/html5-custom-data-attributes/
例如:
<div id="my_awesome_location" data-location-id="<%= @location.id %>">...</div>
然后像这样加载你的ajax:
id = $("#my_awesome_location").data('location-id')
$.ajax
url: Routes.map_group_path(id) #=> "/map_groups/#{id}.json"
type: "get"
dataType: "json"
...
无论如何要怎么做
但是,如果您绝对必须在 CoffeeScript 中使用 ERB 样式标签,您可以使用coffee.erb
文件扩展名来实现:
http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets
2.3.3 JavaScript/CoffeeScript 和 ERB
如果您将 erb 扩展添加到 JavaScript 资产,使其类似于 application.js.erb,那么您可以在 JavaScript 代码中使用asset_path 帮助程序:
$('#logo').attr({
src: "<%= asset_path('logo.png') %>"
});
这将写入被引用的特定资产的路径。
同样,您可以在具有 erb 扩展名的 CoffeeScript 文件中使用asset_path 帮助程序(例如,application.js.coffee.erb):
$('#logo').attr src: "<%= asset_path('logo.png') %>"
为什么你可能不想那样做
我建议使用上述库而不是直接 ERB 的原因是控制器/视图和资产之间的紧密耦合。
这也意味着您必须先预加载整个应用程序,然后才能进行资产编译,因此如果您尝试部署到 Heroku 之类的 PaaS,那么您将在后面受到影响。
https://devcenter.heroku.com/articles/rails-asset-pipeline
在 slug 编译过程中,应用程序的配置变量在环境中不可用。因为必须加载应用程序才能运行 assets:precompile 任务,任何需要存在配置变量的初始化代码都应该优雅地处理 nil 情况。
基本上,如果你稍微改变你的控制器,你就有可能破坏你的资产。最好将它们保持为单独的单元,并引入一个中介层来处理您要解决的问题。