Почему появляется эта ошибка двойного рендеринга? - PullRequest
3 голосов
/ 26 августа 2011

В моем приложении rails внезапно появляется ошибка двойного рендеринга (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at mos ....etc...), и я не могу понять, где находится двойной рендер. Это происходит, когда пользователь вводит запрос в неправильном формате. Вот код, который проверяет формат и отображает ошибки:

 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 example 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 example GP07-8)
      redirect_to(:action => "index") and return
    end

Есть предложения?

ОБНОВЛЕНИЕ

Код действия контроллера по запросу:

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

Ответы [ 2 ]

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

Я предложу рефакторинг для кода действия и предоставлю вам возможность рефакторинга остальных. , ,

def show
  unless user_formulated_request_properly?
    redirect_to(:action => "index")
    return
  end
  respond_to do |format|
    format.html 
  end
end
В случае, если это не очевидно, у вас не должно быть никаких перенаправляющих вызовов в user_formulated_request_properly?, и вы также не должны вызывать yield. (imho, yield - наиболее часто используемая функция языка рубина)
2 голосов
/ 26 августа 2011

Я делаю некоторые предположения относительно вашего кода.

Предполагая, что if_user_formulated_request_properly не является действием вашего контроллера, ваше действие контроллера вызывает этот метод.Когда вы делаете возврат, вы выходите из if_user_formulated_request_properly, но управление возвращается к коду в вашем методе действия.

Я думаю, вы ожидаете, что он вернется из метода действия, но это не то, что происходит.Вместо этого он переходит к следующей строке в действии.

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