如何在js资产文件中使用ruby? (未定义的方法'body')

问题描述 投票:1回答:3

我正在关注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文件。但事实并非如此。为什么?

javascript ruby-on-rails actioncable
3个回答
2
投票

您的messages.js.erb位于assets文件夹中,ERB将仅在资产编译时运行一次。

更容易在广播之前进行格式化,同时仍处于ruby控制器环境中:

ActionCable.server.broadcast 'messages',
            body: helpers.simple_format(@message.body),
            user: @message.user.username,
            time: @message.created_at

1
投票

如果要在任何.erb文件中运行Ruby代码,则必须使用围绕Ruby文本的<% ... %><%= ... %>表示法。 =中的<%= ... %>用于输出代码。

https://guides.rubyonrails.org/layouts_and_rendering.html


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。

© www.soinside.com 2019 - 2024. All rights reserved.