簡體   English   中英

如何在js資產文件中使用ruby? (未定義的方法“ body”)

[英]how to use ruby in a js assets file? (undefined method 'body')

我正在學習本教程 ,但遇到一個問題,即在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>"
 }
});

由於該變量是js,因此我無法執行simple_format(data.body) 這是我的消息控制器中的#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文件中。 但事實並非如此。 為什么?

您的messages.js.erb位於assets文件夾中,並且ERB在資產編譯時僅運行一次。

更容易的是仍在紅寶石控制器環境中進行廣播之前進行格式化:

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

當您要在任何.erb文件中運行Ruby代碼時,必須在Ruby文本周圍使用<% ... %><%= ... %>表示法。 =<%= ... %>是用於輸出的代碼。

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

如果要在此處顯示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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM