如何在 js 资产文件中使用 ruby? (未定义的方法 'body')
how to use ruby in a js assets file? (undefined method 'body')
我正在关注 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 文件中。但事实并非如此。为什么?
如果您的任何 .erb 文件中有您想要 运行 的 Ruby 代码,您必须使用 <% ... %>
或 <%= ... %>
符号围绕 Ruby 文字。 <%= ... %>
中的=
用于输出代码。
如果你想让 data
出现在这里,它必须是一个像 @data
这样的实例变量,它在控制器中分配,以便在呈现视图时出现。
从那里你可以在"Ruby mode"中做任何你想做的事,使用:
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
您的 messages.js.erb
在 assets
文件夹中,ERB 只会在资产编译时 运行 一次。
在广播之前格式化更容易,同时仍在 ruby 控制器上下文中:
ActionCable.server.broadcast 'messages',
body: helpers.simple_format(@message.body),
user: @message.user.username,
time: @message.created_at
我正在关注 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 文件中。但事实并非如此。为什么?
如果您的任何 .erb 文件中有您想要 运行 的 Ruby 代码,您必须使用 <% ... %>
或 <%= ... %>
符号围绕 Ruby 文字。 <%= ... %>
中的=
用于输出代码。
如果你想让 data
出现在这里,它必须是一个像 @data
这样的实例变量,它在控制器中分配,以便在呈现视图时出现。
从那里你可以在"Ruby mode"中做任何你想做的事,使用:
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
您的 messages.js.erb
在 assets
文件夹中,ERB 只会在资产编译时 运行 一次。
在广播之前格式化更容易,同时仍在 ruby 控制器上下文中:
ActionCable.server.broadcast 'messages',
body: helpers.simple_format(@message.body),
user: @message.user.username,
time: @message.created_at