4

これは私に大きな頭痛を与えています...

そのため、ユーザーのプレーヤーに関するさまざまな情報を一覧表示するサイドバーを必要とするアプリがあります。このサイドバーの 1 つのセクションは友達リストです。ここで、プレイヤー A がプレイヤー B にフレンド リクエストを送信すると、リクエストは自動的に B のサイドバーに記録されるはずです。これには WebSocket を使用するつもりです。

これが私のcp.js.coffe.erbファイルです (現時点では、ERB のスニペットはわずかしかありません。さらに多くの負荷がかかるため、最初にこれを機能させることをお勧めします):

$ ->
  $("#cp").accordion()

  if `"WebSocket" in window`
    socket = new WebSocket("ws://localhost:8080") 

  socket.onopen = =>
    console.log("Connection Open")
    init = {
      sender: "cp"
      action: "init"
      user:   <%= @user.id %>
      token:  <%= cookies["remember_token"] %>
    }

    socket.send(init.to_json)

  socket.onerror = (e)=>
    console.log(e)

  socket.onclose = =>
    console.log("Closed")

  socket.onmessage = (m)=>
    console.log("Recieved: #{m.data}")
    msg = m.data.JSON.parse
    switch msg.action
      when "ret_init"

      when "friend_udt"
        refreshFriend()

refreshFriend() ->
  html = "<%= j render 'layouts/friends' %>"
  $('#friends').empty()
  $('#friends').add(html)

理論的には、コード自体は問題なく動作しますが、問題はRails ではアセット パイプラインで ERB を使用できないため、このファイルはapp/views/layouts.ファイルは、コントローラー内で宣言された変数にアクセスしたり、renderメソッド (または他のほとんどの ERB メソッド) を使用したりすることはできません。

ここに問題があります:私は自分のapplication.html.erbファイルに上記のファイルを含めることができず、AJAXでファイルを要求することを検討しましたが、Javascriptをすぐに1回だけ実行するという私の理解から、これのメソッドを常に実行する必要がありますサイドバーを更新できます。

このファイルを ERB および CoffeScript と連携してページで継続的に使用できるようにする方法はありますか? AJAX 要求メソッド全体を誤解していますか?


@nzifnab の JS に関するサポートに感謝します。今、私の友人のパーシャルは次のようになります。

<ul id="friendlist">
    <% if Relation.find_by(owner: @user.id, type: "freq") != nil %>
        <% Relation.find_by(owner: @user.id, type: "freq").each do |r| %>
            <li class="friend-request-cp"><%= link_to "/#{User.find(r.character).name}" %></li>
        <% end %>
    <% end %>
    <% if Relation.find_by(owner: @user.id, type: "friend") != nil %>
        <% Relation.find_by(owner: @user.id, type: "friend").each do |r| %>
            <li class="friend-cp"><%= link_to "/#{User.find(r.character).name}" %></li>
        <% end %>
    <% end %>
</ul>

各アイテムに 2 つの異なるスタイルを適用する必要があるため、ここで ERB を使用しています。ページが最初にナビゲートされたときにロードされるため、これは正常に機能しますが、私のコードは、新しい相互作用の通知が届くたびにその部分を再レンダリングすることになっていました。次に、データベースのデータを使用してリストを再作成します。これを行うより効率的な方法はありますか?hamlcoffeeassetsあなたが私に見せてくれた宝石でまだこれを行うことができますか?


少し話が逸れますが
、私はWindows 7 で Ruby 2.0.0-p247 と Rails 4 を使用しています。Ubuntu とは大きく異なる gem とのいくつかの主要な互換性の問題があるため、これを含める必要があると感じました。13.04 から 13.10 に更新すると、その OS のすべての Ruby Gem が壊れたため、Ubuntu から Windows に移行する必要がありました。修正を探す必要はありません。文字通り、このアプリを構築するのに 4 日しかありません。

4

3 に答える 3

3

アセット パイプラインで使用することもできerbますが、すべてのユーザーに対して 1 回ではなく、1 回だけレンダリングされることを覚えておく必要があり@userます。 . erbルートパスや環境変数などにはコーヒーファイルで使用できますが、ユーザー固有の構成やJSへの動的変更などには使用できません。とにかく悪い習慣です。

実際にすべきことは、Rails を使用して Cookie を読み取ろうとするのではなく、javascript ライブラリを使用して Cookie を読み取ることです (これにより、実行しようとしているように見えるいくつかの操作にアクセスできるようになります)。さらに動的な動作が必要な場合は、データ属性またはその他の値を html DOM 自体にレンダリングし、javascript を使用してそれを読み取る必要があります。

この Cookie ライブラリをご覧ください: https://github.com/carhartl/jquery-cookie

簡単なグーグル検索で他にもたくさんあります。

socket.onopen = =>
  console.log("Connection Open")
  init = {
    sender: "cp"
    action: "init"
    user:  $.cookie('user_id')
    token:  $.cookie('remember_token')
  }

JS を使用してビューの新しいマークアップをレンダリングするには、いくつかの方法があります。1 つの方法は、js テンプレートを使用することです。私はhamlcoffeeassetsここのライブラリの大ファンです: https://github.com/netzpirat/haml_coffee_assetsただし、ERB ではなく、ビューに haml を使用しています。ERB の亜種もあります。

app/assets/templates/friend.jst.hamlc次のようにマークアップを追加します。

%p This is my friend markup #{@friend.name}

そして、次のように JS からレンダリングできます。

$('#friends').append(JST['templates/friend'](friend: {name: 'Bob'}))

テンプレートのマークアップに、渡した値を補間して追加します。私の例では、#friendsコンテナ内に次のマークアップが追加されます。

<p>This is my friend markup Bob</p>

または、レールを介して必要なパーシャルを単なる文字列として JSON 応答にレンダリングし、それをドキュメントに挿入することもできます...

したがって、JS は次のようになります。

socket.onmessage = (m)=>
  console.log("Recieved: #{m.data}")
  msg = m.data.JSON.parse
  switch msg.action
    when "ret_init"

    when "friend_udt"
      refreshFriend(msg.friendHTML)

refreshFriend(html) ->
  $('#friends').html(html)

アップデート

あなたのERBの質問を参照して...まず第一に、パーシャルは非常に非効率的で、レンダリングするたびにデータベースに同様の呼び出しを4回行います。 マークアップ言語 (私は ERB よりも好みます) で使用haml_coffee_assetsします。ERB が必要な場合は、代わりに eco を使用してください: https://github.com/sstephenson/ecohaml

これを JS でレンダリングする場合は、この「フレンド関係」データを通知データ応答を介して JSON として送信する必要があります。JavaScript パーシャルをレンダリングするときに、アクティブ レコードまたはコントローラー メソッドまたはインスタンス変数にアクセスできません。サーバーにアクセスしないでください。その時点であなたの JavaScript がアクセスできるものだけを使用します。

于 2013-10-31T23:10:55.947 に答える
0

これは実際には に移動する必要app/assets/javascripts/cp.js.coffee.erbがあります。アセット パイプラインで erb を問題なく使用できます (こちらを参照) coffee

これを行うと、これを ajax 経由で問題なく呼び出すことができるはずです。パスは/assets/cp.js.

于 2013-10-31T22:41:21.963 に答える
0

この宝石を試してみてください: ' coffeebeans '

  1. コーヒーファイルに「some_file.html.erb」という名前を付けます

    <%= coffeescript_tag_do %> 
        # your coffee script here ...
    <% end %>
    
  2. 別のerbファイルで:

    <%= render file: '.../some_file' %>
    
于 2014-10-20T11:55:20.660 に答える