这让我很头疼...
所以我有一个应用程序,它需要一个侧边栏,列出与用户播放器有关的各种信息。此侧边栏的一部分是朋友列表。现在,当玩家 A 向玩家 B 发送好友请求时,该请求应该会自动记录在 B 的侧边栏中,我打算使用 WebSockets 来执行此操作。
这是我的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,并且我需要不断地使用其中的方法可用于更新侧边栏。
有没有办法包含这个文件,以便它与 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>
我需要对每个项目应用两种不同的样式,因此我在这里使用 ERB。这很好用,因为它是在第一次导航到页面时加载的,但是我的代码应该在每次通知通过任何新交互时重新呈现该部分。然后它将再次使用数据库中的数据重新填充列表。有没有更有效的方法来做到这一点?我还能用hamlcoffeeassets
你给我看的宝石做这个吗?
随之而来的是轻微的切线:
顺便说一句,我在 Windows 7 上使用 Ruby 2.0.0-p247 和 Rails 4。我觉得有必要将其包括在内,因为与 Ubuntu 有很大不同的 gem 存在一些主要的兼容性问题。我不得不从 Ubuntu 迁移到 Windows,因为从 13.04 更新到 13.10 破坏了该操作系统上的所有 Ruby Gem。我不需要找到解决办法:我实际上只有四天的时间来构建这个应用程序。