1

私は機能を分離するという考えが好きで、これは未来の方法のようです.

しかし、Rails ERB や PHP などの組み込み言語のループ内に JavaScript を統合することに慣れています。この言語では、特定のオブジェクトの ID を JavaScript の参照として使用できます。

レールの例:

<% @comments.each do |comment| %>
  <div id="comment_<%= comment.id %>">
    <%= comment.text %>
    <% link_to_function "Reply", "$('comment_#{comment.id}').insert(\"#{escape_javascript(render :partial => "_form", :locals => {:comment => comment})}\", {position: 'bottom'});" %>
  </div>
<% end %>

Ruby のメソッドを JavaScript 内で使いたいと思ったのはこれだけではありません。定数を使用したり、ループuser.enabled?または内のオブジェクトで他の ruby​​ メソッドを呼び出したりuser.full_name、それらのオブジェクトでパーシャルをレンダリングしたりしたい場合があります。

では、すべての JavaScript が別のファイルまたはループの外にある場合、これはどのように達成されるのでしょうか? CSS セレクターを使用して、javascript で一連の div を反復処理できることはわかりましたが、これでは、オブジェクトに対して ruby​​ メソッドを呼び出すことができません。

私は何が欠けていますか?ありがとう!

4

5 に答える 5

2

このスクリーンキャストhttp://railscasts.com/episodes/229-polling-for-changesに示すように、「data-id」パラメーターを使用して行う必要があると思います

于 2010-09-07T19:54:32.977 に答える
1

特定の例では、div要素の ID 属性をコメント ID に設定したため、マークアップ内にエンコードされたコメント ID が既にあります。そのため、JavaScript をそれから切り離すことができます。

于 2010-09-07T19:56:32.983 に答える
0

その力を理解するには、JavaScript の知識がもう少し必要です。特に jQuery です。あなたの例は次のように解決します:

<% @comments.each do |comment| %>
  <div class="comment">
    <%= comment.text %>
    <a href="reply.php?id=<%= comment.id %>" class="reply">Reply</a>
  </div>
<% end %>
<script type="text/javascript">
  $('.comment .reply').click(function(e) {
    e.preventDefault();
    var url = $(this).attr('href');
    var result = url.match(/\?id=(\d+)([^\d]|$)/);
    var id = (result && result[1]);
    if (id) {
      // do whatever you want to do with the id
    }
  });
</script>

利点:

(1) あちこちに JavaScript がありません

(2) javascriptなしで動作

于 2010-09-07T20:06:32.363 に答える
0

jquery を使用して申し訳ありませんが、Web 開発は jquery や類似のライブラリがないと本当につまらないものです。

あなたの最初の苦情(現在のコメントを入手してください)については、javascriptthisがうまく機能します。

onclick="my_function(this);"

そしてjsファイルで

my_function = function(target) {
    // clicked element passed in
    // now, let's get comment element by class
    var comment = $(target).parents('.comment');
}

2番目の苦情については...私はそれを頻繁に必要とすることはありませんでしたが、JavaScriptで使用するためにhtmlにデータを含めることがあります。前の例の拡張:

<div class="comment" comment_id="<%= comment.id %>"></div>

そして、my_function

var comment_id = comment.attr('comment_id');
于 2010-09-07T19:56:01.277 に答える
0

クライアント側のスクリプトが「オプション」オブジェクトをパラメーターとして受け取るようにします。サーバー側のスクリプトを使用しないでください。スクリプトを独自の .js ファイルに入れます。

次に、js を出力するサーバー側スクリプトで「options」オブジェクトを作成します。スクリプトをインクルードし、そのエントリポイント関数を呼び出して、「オプション」オブジェクトを渡します。

于 2010-09-07T20:01:51.500 に答える