在 Rails 中呈现通过 Pusher 传递的对象
Rendering an object passed through Pusher in Rails
我正在尝试实现一个实时聊天应用程序。
我正在使用推送器通知服务器有关按钮单击的信息,然后将消息对象作为 message 传递给订阅者。我需要做的是,在其他用户的聊天屏幕 (show.html.erb) 中动态呈现该消息。这是我的周期:
// MessagesController.rb
def create
conversation = Conversation.find(params[:conversation_id])
message = Message.create(content: params[:content], user_id: params[:user_id])
conversation.messages << message
Pusher['test_channel'].trigger('my_event', {
message: message
})
end
我的订阅者是
// show.html.erb
// some html code
<ul class="chats">
<%= render @messages %>
</ul>
// some html code
<script>
// some js code
var channel = pusher.subscribe('some_channel');
channel.bind('some_event', function(data) {
// What to do here?
});
</script>
如果您使用的是JQuery,
channel.bind('some_event', function(data) {
$('.message').text(data.message);
});
看到这个tutorial。
这假设您使用的是 jquery。它也未经测试,因此可能有一些 bugs/syntax 错误。
Ajax方法:
JS
channel.bind('some_event', function(data) {
$.ajax({
url:'/messages/'+data.message.id,
success:function(html){ $('.chats').append(html)}
});
});
路线:
match '/messages/:id' => "messages#show_no_layout"
控制器:
def show_no_layout
@message = Message.find(params[:id])
render "show", layout: false
end
查看(show.html.erb):
<%= *whatever you want in here* %>
ICH(read more) 方法:
这当然需要添加一个额外的 js 文件,这就是为什么这不是我的第一个建议。
模板:
<script id = "messageTemplate" type = "text/html">
{{ message.content }}
// plus whatever else you want.
</script>
channel.bind('some_event', function(data) {
messageHtml = ich.messageTemplate(data.message);
$('.chats').append(messageHtml);
});
我正在尝试实现一个实时聊天应用程序。
我正在使用推送器通知服务器有关按钮单击的信息,然后将消息对象作为 message 传递给订阅者。我需要做的是,在其他用户的聊天屏幕 (show.html.erb) 中动态呈现该消息。这是我的周期:
// MessagesController.rb
def create
conversation = Conversation.find(params[:conversation_id])
message = Message.create(content: params[:content], user_id: params[:user_id])
conversation.messages << message
Pusher['test_channel'].trigger('my_event', {
message: message
})
end
我的订阅者是
// show.html.erb
// some html code
<ul class="chats">
<%= render @messages %>
</ul>
// some html code
<script>
// some js code
var channel = pusher.subscribe('some_channel');
channel.bind('some_event', function(data) {
// What to do here?
});
</script>
如果您使用的是JQuery,
channel.bind('some_event', function(data) {
$('.message').text(data.message);
});
看到这个tutorial。
这假设您使用的是 jquery。它也未经测试,因此可能有一些 bugs/syntax 错误。
Ajax方法:
JS
channel.bind('some_event', function(data) {
$.ajax({
url:'/messages/'+data.message.id,
success:function(html){ $('.chats').append(html)}
});
});
路线:
match '/messages/:id' => "messages#show_no_layout"
控制器:
def show_no_layout
@message = Message.find(params[:id])
render "show", layout: false
end
查看(show.html.erb):
<%= *whatever you want in here* %>
ICH(read more) 方法:
这当然需要添加一个额外的 js 文件,这就是为什么这不是我的第一个建议。
模板:
<script id = "messageTemplate" type = "text/html">
{{ message.content }}
// plus whatever else you want.
</script>
channel.bind('some_event', function(data) {
messageHtml = ich.messageTemplate(data.message);
$('.chats').append(messageHtml);
});