Рендеринг и / или перенаправление были вызваны несколько раз в этом действии ..? - PullRequest
6 голосов
/ 31 августа 2011

Я получаю DoubleRenderError и не могу понять, почему! По сути, у меня есть действие, которое вызывает другое действие, которое проверяет введенный пользователем запрос на наличие ошибок, и если возникает ошибка, она останавливается и отображает ошибку. Но когда я набираю запрос с ошибкой, то когда я получаю двойной рендер! Есть предложения?

Вот действие проверки ошибок:

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

И на всякий случай вам нужно действие, вызывающее это действие ..

 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

Также забыл упомянуть, что изначально это было приложение rails 2 и работало, эта ошибка началась, когда я обновился до rails 3 (я верю), так что, возможно, rails 3 делает что-то другое с and return?

Ответы [ 2 ]

7 голосов
/ 31 августа 2011

Вы возвращаетесь только из метода if_user_formulated_request_properly, что означает, что redirect_to и respond_to выполняют рендеринг.

Вы можете попробовать это:

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
1 голос
/ 08 июня 2016

Это мое решение для некоторого случая:

"Основная причина заключается в том, что некоторая часть response_body назначается до того, как сработает ошибка.

Вы можете попробовать очистить тело ответа перед вызовомсделать в обработчике исключений. "

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

Источник: DoubleRenderError в Rails 4.1 при спасении из InvalidCrossOriginRequest

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...