将rails变量传递给js erb

时间:2014-02-23 19:34:30

标签: javascript ruby-on-rails ruby ajax controller

我正在使用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,因此它会被广播到特定聊天的正确私有频道。

我该怎么做?

3 个答案:

答案 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文件夹)