Javascript 如何在js资产文件中使用ruby?(未定义的方法';正文';)
我发现在ActionCable文件中使用ruby会导致Javascript 如何在js资产文件中使用ruby?(未定义的方法';正文';),javascript,ruby-on-rails,actioncable,Javascript,Ruby On Rails,Actioncable,我发现在ActionCable文件中使用ruby会导致未定义的方法“body”错误。如何在此文件中使用ruby?我希望通过Action Cable提交的数据在附加时能够正确格式化,而普通js无法做到这一点。这是我的app/assets/js/channels/messages.js.erb文件: App.messages = App.cable.subscriptions.create('MessagesChannel', { received: function(data) { $("#
未定义的方法“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>"
}
});
我在操作中定义了
@message
,应该将其传递到js.erb文件中。但事实并非如此。为什么?当您想要在任何.erb文件中运行Ruby代码时,必须在Ruby文本周围使用
或
符号。
中的=
用于输出代码
当您想要在任何.erb文件中运行Ruby代码时,必须在Ruby文本周围使用
或
符号。
中的=
用于输出代码
如果希望
数据
出现在此处,则必须是一个实例变量,如@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>"
}
render_消息:函数(数据){
返回“:”
}
或者类似的东西
请记住,在将内容转发给客户端进行处理之前,ERB替换只应用一次。渲染输出后无法运行Ruby。如果您希望
数据出现在这里,它必须是一个实例变量,如@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>"
}
render_消息:函数(数据){
返回“:”
}
或者类似的东西
请记住,在将内容转发给客户端进行处理之前,ERB替换只应用一次。呈现输出后无法运行Ruby。您的messages.js.erb
位于assets
文件夹中,erb在assets编译时只运行一次
在ruby控制器上下文中,广播前更容易格式化:
ActionCable.server.broadcast 'messages',
body: helpers.simple_format(@message.body),
user: @message.user.username,
time: @message.created_at
您的messages.js.erb
位于assets
文件夹中,erb在资产编译时只运行一次
在ruby控制器上下文中,广播前更容易格式化:
ActionCable.server.broadcast 'messages',
body: helpers.simple_format(@message.body),
user: @message.user.username,
time: @message.created_at
如果您使用的是ERB,那么您必须内联
,否则它将根本不会运行任何Ruby代码。这非常有意义。我以为
只用于html文件。但是,这种解决方案带来了一个新问题:数据
变量位于erb外部,而不是内部。我得到一个未定义的局部变量或方法
。ERB指令用于任何类型的文本文件,其中JavaScript、HTML、CSS甚至JSON或CSV都符合条件。现在我们生活在一个以文本为主的世界里。如果您使用的是ERB,那么您必须使用
内联,否则它根本不会运行任何Ruby代码。这很有意义。我以为
只用于html文件。但是,这种解决方案带来了一个新问题:数据
变量位于erb外部,而不是内部。我得到一个未定义的局部变量或方法
。ERB指令用于任何类型的文本文件,其中JavaScript、HTML、CSS甚至JSON或CSV都符合条件。我们现在生活在一个以文本为主的世界里,这很有道理。我还以为这只适用于html文件。不过,这种解决方案带来了一个新问题:数据变量在erb外部找到,而不是在内部。我得到了一个未定义的局部变量或方法“data”
错误。我想还应该指出,该代码是从app/assets/javascripts
文件运行的,而不是从控制器运行的。这很有意义。我还以为这只适用于html文件。不过,这种解决方案带来了一个新问题:数据变量在erb外部找到,而不是在内部。我得到了一个未定义的局部变量或方法“data”
错误。我想还应该指出,这段代码是从app/assets/javascripts
文件运行的,而不是从控制器运行的。我忘了在上面的代码中包含我的控制器操作(请参见编辑#3),但这正是我一直在做的。我在#create
中定义了一条@消息,但在ActionCable.server.broadcast
之外。广播消息中有正文
、用户
和时间
的变量。这些变量在js中工作,但在ruby中不工作。在js.erb
文件中使用@message.body
也没什么不同。我忘了在上面的代码中包含我的控制器操作(请参见编辑#3),但这就是我一直在做的事情。我在#create
中定义了一条@消息,但在ActionCable.server.broadcast
之外。广播消息中有正文
、用户
和时间
的变量。这些变量在js中工作,但在ruby中不工作。在js.erb
文件中使用@message.body
也没什么不同。哦,right facepalm您可以通过调用helpers.helper\u name
在控制器中使用helpers。非常感谢。哦,right facepalm您可以通过调用helpers.helper\u name
在控制器内使用helpers。非常感谢。