Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在js资产文件中使用ruby?(未定义的方法';正文';)_Javascript_Ruby On Rails_Actioncable - Fatal编程技术网

Javascript 如何在js资产文件中使用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) { $("#

我发现在ActionCable文件中使用ruby会导致
未定义的方法“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。非常感谢。