Задать вопрос
  • Как и куда перенести сайты с ucoz?

    @AndreyBuyback Автор вопроса
    Alex, ucoz с 5 мая платным будет для сайтов подобных школьным, или что-то вроде того. В общем денюжку у государства будут просить.
  • Как подгружать чат на страницу после загрузки страницы?

    @AndreyBuyback Автор вопроса
    Спасибо за идею) Я пытаюсь при подключении пользователя к Action cable вызвать метод рендера чата на сервере, но выдает ошибку, вкратце такая схема:
    Коннект на клиенте:
    consumer.subscription.create('ChatChannel', {
         connected() {
         },
         disconnected() {
         },
         received() {
             if (data['chat']) {  // если в ответе чат, то рендерим его, иначе полагаем что он уже отрендерен
                                        // и соответственно при создании новых сообщений вставляем их в уже готовый чат
                    chat.element.innerHTML = data['chat']
              } else {
                    if (chat.hasMessagesTarget) {
                       chat.messagesTarget.insertAdjacentHTML('beforeEnd', data)
                    }
               }
         }
    }

    Html код
    <div id="chat" data-controller="chat">
        <div id="chat-wrapper">
            <div class="chat-messages" data-target="chat.messages">
               <%= render partial: 'messages/message', collection: @messages, as: :message %>
            </div>
            <div class="chat-message-form">
                <%= render partial: 'messages/form', object: @message %>
            </div>
        </div>
    </div>

    Итак, когда пользователь приконнектился вызывается в `chat_channel.rb` следующий метод:
    def subscribed
       stream_from 'chat_channel'
       ChatBroadcastJob.perform_later // вызываю job где находится рендер чата
    end

    Идем в `chat_broadcast_job.rb`, там следующее:
    class ChatBroadcastJob < ApplicationJob
      queue_as :default
      
        def perform
            ActionCable.server.broadcast("chat_channel", { chat: render_message } )
        end
    
        private
    
            def render_message
                ## Пробовал таким образом ...
                # @messages = Message.all
                # @message = Message.new
                # ChatController.render template: 'chat/show', layout: false
                ## И так ...
                ChatController.get_chat
                ## Но выдает ошибку..
            end
    end

    Вот сам `chat_controller.rb` контроллер:
    class ChatController < ApplicationController
    
        def self.get_chat
            @messages = Message.all
            @message = Message.new
            render template: 'chat/show', layout: false
        end
    end

    Так вот я пробовал как я указал выше. Но выдает следующую ошибку:
    [ActiveJob] [ChatBroadcastJob] [5c2e08a6-a429-4311-8342-14e8f6c5083a]   Rendered chat/show.html.erb (Duration: 1.4ms | Allocations: 1485)
    [ActiveJob] [ChatBroadcastJob] [5c2e08a6-a429-4311-8342-14e8f6c5083a] Error performing ChatBroadcastJob (Job ID: 5c2e08a6-a429-4311-8342-14e8f6c5083a) from Async(default) in 2.3ms: ActionView::Template::Error (No route matches {}):  # ------------------ ОШИБКА
    /home/n1/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/actionpack-6.0.2.1/lib/action_dispatch/journey/formatter.rb:57:in `generate'

    Хотя аналогичная схема при отправке сообщений работает:
    class MessageBroadcastJob < ApplicationJob
        queue_as :default
      
        def perform(message)
            ActionCable.server.broadcast "chat_channel", render_message(message)
        end
    
        private
    
            def render_message(message)
                MessagesController.render partial: 'messages/message', locals: { message: message }, layout: false
            end
      end
  • Как заставить ajax отрендерить js ответ в Ruby On Rails?

    @AndreyBuyback Автор вопроса
    Все, нашел, ранее делал заголовки с полем Content-Type а надо было вот так xmlHttp.setRequestHeader("Accept", "text/javascript"); для ответа в js и ("Accept", "application/json") для ответа в json) В итоге получилось так что в случае с js сервер отдает скрипт клиенту, а там уже его надо исполнять через eval().
  • Как заставить ajax отрендерить js ответ в Ruby On Rails?

    @AndreyBuyback Автор вопроса
    Какой заголовок добавить в запрос, чтобы рельсы , а в частности respond_to поняли, что мне нужен ответ в виде format.js а не format.html?