我正在使用FAYE来广播聊天消息而无需刷新页面,如果我对频道进行硬编码,它就可以正常工作。但是我想从我的消息控制器中传入一个变量并将其用作广播的频道,这样我可以在两个人之间进行私人聊天
在app / views / messages / create.js.erb
中<% broadcast @channel do %>
$("#chat").append("<%= escape_javascript render(@message) %>");
<% end %>
$("#new_message")[0].reset();
如果我将@channel更改为“/ messages”,它将正常工作,并且在消息存储在数据库中后,我的消息将立即显示在当前正在查看“/ messages”频道的所有人的屏幕上。
在我的消息控制器中,我有
def private
...
@channel = "/"+@id1.to_s+"chatwith"+ @id2.to_s
...
end
这使得每个双人聊天都有一个只有他们有权访问的独特频道。页面上不允许其他用户访问该通道,这是控制器中其他代码完成的操作。
我只需要在每次发送邮件时都在create.js.erb中访问@channel,因此它会被广播到特定聊天的正确私有频道。
我该怎么做?
答案 0 :(得分:0)
问题是您在私有方法中定义了@channel
,因此视图无法访问它,在公共方法中移动@channel
变量或将现有方法设为公共
def <my_method>
.......
@channel
.......
end
答案 1 :(得分:0)
我在控制器中使用了respond_to来计算它。起初,我尝试在我的消息控制器的privatechat方法中使用它,它最终没有工作。但是我注意到我的消息控制器的create方法中的respond_to调用正在工作,这是消息传递给create.js.erb的方式,当我硬编码频道时广播。所以我决定在创建方法中声明@channel而不是消息控制器的privatechat方法,现在一切都按照我想要的方式工作。
答案 2 :(得分:0)
您可以在相应的控制器操作中设置变量值,并且它可用于与操作名称匹配的任何视图文件(在相应的视图子文件夹中 - 例如,带有create action的articles_controller对应于create.js.erb文件中的views / articles文件夹)