0

Rails アプリから関連する coffeescript ファイルにインスタンス変数を渡そうとしていますが、現在解析していないようです。私は何が欠けていますか?

location.js.coffee.erb

$.ajax
  url: "/map_groups/<%= @id %>.json"
  type: "get"
  dataType: "json"
  async: false
  success: (response) ->
    exports.response = response

location_controller.rb

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 経由で送信されます。取得する json データを coffeescript に知らせるために、カスタム ルートを作成しました。

get "/locations/map-group/:id", controller: :locations, action: :index, as: :map_group

私のコントローラーを参照すると、ユーザーがプレーン オールド/locationsにアクセスすると、ID のデフォルトが 1 になることがわかります。それ以外の場合、ID は URL で指定されたものになります。coffeescript ファイルは、AJAX 呼び出しを介してその ID に関連するデータを取得する必要があります。そのIDが何であるかをcoffeescriptに伝えるにはどうすればよいですか?

4

2 に答える 2

5

代わりに私がすること

回避できるのであれば、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 ケースを適切に処理する必要があります。

基本的に、コントローラーを少しでも変更すると、資産を壊す危険があります。それらを個別のユニットとして保持し、解決しようとしているものを処理するメディエーション レイヤーを導入することをお勧めします。

于 2013-10-09T01:52:02.907 に答える