1

RoR には、ビューをレンダリングするコントローラーがあります。ある日、特定のビューをレンダリングするだけでなく、レンダリング後にコントローラー ( @productなど) からのデータを使用して JavaScript コードを実行するコントローラーが必要でした。


1.インラインJavaScript

そこで、products/show.html.erbに移動して、次のように書きました。

<%= javascript_tag "alert('#{@product.name} is just awesome!')" %>


2.サーバーデータを含むアセット

しかし、私たちは皆大人で、目立たない javascriptについて知っているので、いくつかの javascript ファイルをレイアウトに含めました。

<%= javascript_include_tag "#{params[:controller]}/#{params[:action]}" %>

そしてapp/assets/javascripts/products/show.js.erbに行き、次のように書きました:

$(document).ready(function(){
  alert('<%= @product.name%> is just awesome!');
});

しかし、アセットが本番環境でプリコンパイルされていることを思い出し、考え続けました。


3. HTML データの属性

一部のデータを JavaScript に渡す別の方法は、ビュー ファイルで html5 データ属性を使用することです。

<div class="product" data-product-name="<%= @product.name %>">

次に、アセットに次のように記述できます。

$(document).ready(function(){
  $('*[data-product-name]').each(
    alert($(this).data('product-name') + ' is just awesome!');
  );
});


4. サーバーへのもう 1 つの要求

とにかく、ビュー ファイルとアセットをキャッシュできるようにしたい場合、データを JavaScript に転送する唯一の方法は、追加の Ajax リクエストを使用することです。@productをクライアントに送信する別のアクションを作成することをお勧めしますか?

ビューのレンダリング中にサーバーからJavaScriptにデータを送信する最も良い方法は何ですか?その理由は何ですか?

4

0 に答える 0