DoubleRenderError(渲染和/或重定向,并在redirect_to或self.render末尾添加’并返回’

每次我将消息插入数据库时​​,我都有一个消息传递系统。 它插入重复项即时获取AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action) 。 我尝试在redirect_to或self.render结束时添加and return ,但它没有帮助。 它似乎是从create方法发生的问题

 # app/controllers/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 

这是我终端的图片

通过去除

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

它仍然插入重复的消息

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

从代码中删除之前的终端图像

这个来自数据库的图像显示它插入了重复项

我插入后从终端的这个新图像

这是视图app / views / messages / index.html.erb

 
Conversation with <input id="conversation_id" type="hidden" value="">

您在create方法中调用renderredirect_to

 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) # <------ render here redirect_to conversation_messages_path(@conversation) # <-- redirect end end private def render_message(message) self.render(partial: 'messages/message', locals: {message: message}) end 

你只能调用其中一个 - 我建议删除render_message或避免使用render方法。 如果要在创建后显示消息,可以使用Flash 。