代わりに私がすること
回避できるのであれば、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 ファイル (例: application.js.coffee.erb) で asset_path ヘルパーを使用できます。
$('#logo').attr src: "<%= asset_path('logo.png') %>"
なぜあなたはおそらくそのようにしたくないのですか
上記のライブラリとストレートな ERB を使用することをお勧めする理由は、コントローラー/ビューとアセットの間に密接な結合があるためです。
また、アセットのコンパイルを行う前に、who アプリ全体をプリロードする必要があることも意味します。そのため、Heroku のような PaaS にデプロイしようとすると、それが遅れをとることになります。
https://devcenter.heroku.com/articles/rails-asset-pipeline
slug のコンパイル プロセス中は、環境でアプリの構成変数を使用できません。assets:precompile タスクを実行するにはアプリをロードする必要があるため、構成変数の存在を必要とする初期化コードでは、nil ケースを適切に処理する必要があります。
基本的に、コントローラーを少しでも変更すると、資産を壊す危険があります。それらを個別のユニットとして保持し、解決しようとしているものを処理するメディエーション レイヤーを導入することをお勧めします。