【问题标题】:DoubleRenderError (Render and/or redirect and adding 'and return' at the end of redirect_to or self.renderDoubleRenderError(渲染和/或重定向并在 redirect_to 或 self.render 的末尾添加“并返回”
【发布时间】:2018-09-01 11:40:18
【问题描述】:

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

# 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

This is an image from my terminal

通过删除

      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

this image of terminal before removing from the code

This an image from database show that it inserting duplicates

This new image from the terminal after i inserted

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

<div class="row">
  <div class="col-md-3 text-center">
   <%= image_tag avatar_url(@other), class: "img-circle avatar-medium" %>
   <strong><%= @other.fullname %></strong>
   <%= link_to "View Profile", @other, class: "btn btn-default" %>
 </div>
<div class="col-md-9">
 <div class="panel panel-default">
   <div class="panel-heading">
    Conversation with <%= @other.fullname %>
    <input id="conversation_id" type="hidden" value="<%= 
    @conversation.id %>">
    </div>
    <div class="panel-body">
    <div class="container text-center">
      <%= form_for [@conversation, @conversation.messages.new], remote: true do |f| %>
          <div class="form-group">
            <%= f.text_field :context, placeholder: "Add a personal message", class: "form-control" %>
          </div>
          <%= f.hidden_field :user_id, value: current_user.id %>
          <div>
            <%= f.submit "Send Message", class: "btn btn-normal" %>
          </div>
      <% end %>
    </div>
  </div>
</div>

<div id="chat">
  <%= render @messages %>
</div>

【问题讨论】:

  • 我确实用视图 .html.erb 更新了我的问题,因为我没有任何 javascript @SimpleLime
  • 问题已解决 @SimpleLime On Rails 5,rails-ujs 替换 jquery_ujs。如果两者都需要,事件将触发两次。

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems


【解决方案1】:

你在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

【讨论】:

  • 它对我不起作用我确实删除了它们,它仍然插入重复消息@mrzasa 我确实用我使用的代码更新了我的问题
  • 它显然有助于解决问题标题中所述的错误:)。如何检查邮件是否重复?
  • 是的,谢谢它解决了这个错误,但我仍然无法工作我从数据库中检查我用数据库@mrzasa 中的图像更新我的问题
  • 我还更新了终端图像,这样你就可以看到那里发生了什么@mrzasa
  • 看起来发送了两个请求(或日志重复)。我会调试客户端(JS)端,
【解决方案2】:

如果您收到错误消息“在此操作中多次调用渲染和/或重定向.....”,如此处所述,您正在使用 redirect_to 并在同一操作(创建)中渲染。很清楚!

现在,我建议您将方法中的 render 替换为 render_to_string 以找到可能的解决方案解决您的问题。

def render_message(message)
  render_to_string(partial: 'messages/message', locals: {message: message})
end

希望这会有所帮助。它对我有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多