8 Stimmen

Render und/oder Redirect wurden in dieser Aktion mehrfach aufgerufen ?

Ich bekomme immer wieder den DoubleRenderError und ich kann nicht herausfinden, warum! Im Grunde habe ich eine Aktion, die eine andere Aktion aufruft, die eine vom Benutzer eingegebene Abfrage auf Fehler überprüft, und wenn theres einen Fehler, seine Haltestellen und zeigt den Fehler. Aber wenn ich eine Abfrage mit einem Fehler eingeben, dass, wenn ich die doppelte Render erhalten! Irgendwelche Vorschläge?

Hier ist die Aktion des Fehlerprüfers:

def if_user_formulated_request_properly
    unless request.post?
      flash[:error] = "This page can only be accessed through the search page. (POST request only)"
 redirect_to(:action => "index") and return
    end

    if params[:query].blank?
      flash[:error] = "Search criteria can not be blank"
redirect_to(:action => "index") and  return
    end

    if !(params[:query] =~ /-/)
      flash[:error] = "( Format of search criteria is wrong.<br /> Should be [IXLSpecClass value][year]-[Message ID] for exam
ple GP07-8)"
redirect_to(:action => "index") and  return
    end

    if !(QueryParser.expression.match(params[:query]))
      flash[:error] = %( Format of search criteria is wrong.<br />Should be [IXLSpecClass value][year]-[Message ID] for examp
le GP07-8)
redirect_to(:action => "index") and return
  end
 yield

Und nur für den Fall, dass Sie die Aktion brauchen, die diese Aktion aufruft

 def show
        if_user_formulated_request_properly do
        @statuses = IXLStatus.find(:all)
        @input_messages = InputMessage.search_by(params[:query].stri
p) unless params[:query].blank?
        @query = params[:query]
        end
        respond_to do |format|
          format.html #default rendering
        end
        end
  end

UPDATE

Auch vergaß zu erwähnen, dies war ursprünglich eine Schienen 2 app und funktionierte, dieser Fehler begann, wenn ich auf Schienen 3 aktualisiert (ich glaube), so vielleicht Schienen 3 tut etwas anders mit and return ?

9voto

Benoit Garret Punkte 13797

Sie kehren nur von der if_user_formulated_request_properly Methode, was bedeutet, dass sowohl die redirect_to und die respond_to ein Rendering durchführen.

Sie könnten dies versuchen:

def user_formulated_request_properly?
  unless request.post?
    flash[:error] = "This page can only be accessed through the search page. (POST request only)"
    return false
  end

  if params[:query].blank?
    flash[:error] = "Search criteria can not be blank"
    return false
  end

  if !(params[:query] =~ /-/)
    flash[:error] = "( Format of search criteria is wrong.<br /> Should be [IXLSpecClass value][year]-[Message ID] for example GP07-8)"
    return false
  end

  if !(QueryParser.expression.match(params[:query]))
    flash[:error] = %( Format of search criteria is wrong.<br />Should be [IXLSpecClass value][year]-[Message ID] for example GP07-8)
    return false
  end

  return true
end

def show
  if user_formulated_request_properly?
    @statuses = IXLStatus.find(:all)
    @input_messages = InputMessage.search_by(params[:query].strip) unless params[:query].blank?
    @query = params[:query]
  else
    redirect_to(:action => "index") and return
  end

  respond_to do |format|
    format.html #default rendering
  end
end

0voto

Hiep Dinh Punkte 644

Dies ist meine Lösung für einige Fälle:

"Der Grund dafür ist, dass ein Teil des response_body zugewiesen wird, bevor der Fehler ausgelöst wird.

Sie könnten versuchen, den Antwortkörper zu löschen, bevor Sie render im Exception-Handler aufrufen."

def render_400
  # Clear the previous response body to avoid a DoubleRenderError
  # when redirecting or rendering another view
  self.response_body = nil

  render(nothing: true, status: 400)
end

Quelle: DoubleRenderError in Rails 4.1 bei der Rettung von InvalidCrossOriginRequest

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X