[英]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文本周圍使用<% ... %>
或<%= ... %>
表示法。 的=
在<%= ... %>
是用於輸出的代碼。
如果要在此處顯示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.