Как использовать Ruby в файле активов JS?(неопределенный метод 'body') - PullRequest
0 голосов
/ 08 февраля 2019

Я следую этому учебнику и у меня возникла проблема, когда использование ruby ​​в файле ActionCable вызывает ошибку 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.Но это не так.Почему?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Если вы хотите, чтобы data присутствовало здесь, это должна быть переменная экземпляра, такая как @data, назначенная в контроллере, чтобы присутствовать при визуализации представления.

Fromтам вы можете делать все, что угодно, в «Рубиновом режиме», используя:

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 после рендеринга вывода.

0 голосов
/ 16 февраля 2019

Ваш messages.js.erb находится в папке assets, и ERB будет работать только один раз во время компиляции ресурсов.

Проще отформатировать перед трансляцией, пока он находится в контексте контроллера ruby:

ActionCable.server.broadcast 'messages',
            body: helpers.simple_format(@message.body),
            user: @message.user.username,
            time: @message.created_at
0 голосов
/ 12 февраля 2019

Если у вас есть код Ruby, который вы хотите запустить внутри любого из ваших файлов .erb, вы должны использовать нотацию <% ... %> или <%= ... %>, окружающую текст Ruby.= в <%= ... %> предназначен для вывода кода.

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

...