我正在关注this tutorial,并遇到在ActionCable文件中使用ruby导致undefined method 'body'
错误的问题。如何在此文件中使用ruby?我希望通过Action Cable提交的数据在添加时正确格式化,而我无法使用普通js做到这一点。这是我的app/assets/js/channels/messages.js.erb
文件:
App.messages = App.cable.subscriptions.create('MessagesChannel', {
received: function(data) {
$("#response").val("");
$('#messages').append(this.render_message(data));
$("#conversation-main").scrollTop($("#conversation-main")[0].scrollHeight);
},
render_message: function(data) {
return "<div class='message'><div><strong>" + data.user + ":</strong> <%= simple_format(@message.body) %></div><div class='date'><%= readable_datetime(@message.created_at) %></div></div>"
}
});
我无法执行simple_format(data.body)
,因为该变量是js。这是我的消息控制器中的#create
操作:
def create
@message = @conversation.messages.new(message_params)
@message.user = current_user
respond_to do |format|
if @message.save
ActionCable.server.broadcast 'messages',
body: @message.body,
user: @message.user.username,
time: @message.created_at
head :ok
end
end
end
我在操作中定义了@message
,应该将其传递到js.erb文件中。但事实并非如此。为什么?
答案 0 :(得分:2)
您的messages.js.erb
位于assets
文件夹中,并且ERB在资产编译时仅运行一次。
更容易的是仍在红宝石控制器环境中进行广播之前进行格式化:
ActionCable.server.broadcast 'messages',
body: helpers.simple_format(@message.body),
user: @message.user.username,
time: @message.created_at
答案 1 :(得分:1)
如果要在任何.erb文件中运行Ruby代码,则必须在Ruby文本周围使用<% ... %>
或<%= ... %>
表示法。 =
中的<%= ... %>
用于输出代码。
答案 2 :(得分:1)
如果您想在此处显示data
,则必须是一个像@data
这样的实例变量,该变量必须在控制器中分配,以便在呈现视图时出现。
从那里,您可以使用以下方式在“ Ruby模式”下进行任何操作:
render_message: function(data) {
return "<div class='message'><div><strong><%= @data.user %>:</strong> <%= simple_format(@data.body) %></div><div class='date'><%= readable_datetime(@data.time) %></div></div>"
}
或类似的东西。
请记住,在内容被转发给客户端进行处理之前,仅一次应用了ERB替换。呈现输出后,无法运行Ruby。