AbstractController :: DoubleRenderError (Render и / или перенаправление были вызваны несколько раз в этом действии - PullRequest
0 голосов
/ 24 мая 2019

Я создаю систему сообщений, в которой один пользователь отправляет сообщение, а другой получает сообщение с обновлением в реальном времени.Раньше это работало, но теперь я получаю ошибку, и ничего не рендерится и не обновляется.

AbstractController :: DoubleRenderError (Рендеринг и / или перенаправление вызывались несколько раз в этом действии. Обратите внимание, что вы можете вызывать только перенаправление рендеринга ИЛИ и не более одного раза для каждого действия. Также обратите внимание, что ни перенаправление, ни рендеринг не завершаютсявыполнение действия, поэтому, если вы хотите выйти из действия после перенаправления, вам нужно сделать что-то вроде «redirect_to (...) and return».):

здесь - messages_controller.rb

class MessagesController < ApplicationController
before_action :authenticate_user!
before_action :set_conversation

def index
   if current_user == @conversation.sender || current_user == 
     @conversation.recipient
     @other = current_user == @conversation.sender ? 
     @conversation.recipient : @conversation.sender
     @messages = @conversation.messages.order("created_at DESC")
   else
   redirect_to conversations_path, alert: "You don't have permission to view this."
   end
   end

def create
  @message = @conversation.messages.new(message_params)
  @messages = @conversation.messages.order("created_at DESC")

 if @message.save
   ActionCable.server.broadcast "conversation_#{@conversation.id}", message: render_message(@message)
   redirect_to conversation_messages_path(@conversation)
 end

end

private

 def render_message(message)
   self.render(partial: 'messages/message', locals: {message: message})
 end

 def set_conversation
   @conversation = Conversation.find(params[:conversation_id])
 end

 def message_params
   params.require(:message).permit(:context, :user_id)
 end
end

Я знаю, что ошибка идет отсюда

 if @message.save
   ActionCable.server.broadcast "conversation_#{@conversation.id}", message: render_message(@message)
   redirect_to conversation_messages_path(@conversation)
 end

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

проблема была с Connection.rb Это было так

module ApplicationCable
class Connection < ActionCable::Connection::Base
   identified_by :current_user

   def connect
   self.current_user = find_verified_user
   logger.add_tags 'ActionCable', current_user.name
   end

   protected
    def find_verified_user
      verified_user = User.find_by(id: cookies.signed['user.id'])
      if verified_user && cookies.signed['user.expires_at'] > Time.now
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

, и когда я перешел на это, он работал

module ApplicationCable
   class Connection < ActionCable::Connection::Base
   end
end
0 голосов
/ 24 мая 2019

В Message.rb

 after_create_commit { MessageJob.perform_later self }

и создайте MessageJob

class MessageJob < ApplicationJob
  queue_as :default

  def perform(message)
   ActionCable.server.broadcast "conversation_#{message.conversation.id}", message: render_message(message)
  end

  private


def render_message(message)
   ApplicationController.renderer.render(partial: 'messages/message', locals: {message: message})
 end
...