Подтвердить что ты не робот

Redirect_to!= return

Я просто хочу дать подтверждение относительно поведения redirect_to.

У меня есть код, который выглядит так:

if some_condition
   redirect_to(path_one)
end

redirect_to(path_two)

Если some_condition = true, я получаю ошибку:

Render и/или перенаправление вызывались несколько раз в этом действии. Обратите внимание, что вы можете вызывать только рендер или перенаправление, и не более одного раза за действие.

Кажется, что метод продолжает выполняться после перенаправления на вызов. Мне нужно создать такой код:

if some_condition
   redirect_to(path_one)
   return
end

redirect_to(path_two)

?

4b9b3361

Ответ 1

Да, вам нужно вернуться из метода при переадресации. Он фактически добавляет только соответствующие заголовки для объекта ответа.

Вы можете написать более рубиновый путь:

if some_condition
    return redirect_to(path_one)
end

redirect_to(path_two)

или другим способом:

return redirect_to(some_condition ? path_one : path_two)

или другим способом:

redirect_path = path_one

if some_condition
    redirect_path = path_two
end

redirect_to redirect_path

Ответ 2

Из http://api.rubyonrails.org/classes/ActionController/Base.html:

Если вам нужно перенаправить на условие чего-то, тогда убедитесь добавить "и вернуться", чтобы остановить выполнение.

def do_something
  redirect_to(:action => "elsewhere") and return if monkeys.nil?
  render :action => "overthere" # won't be called if monkeys is nil
end

Ответ 3

Вы также можете сделать

redirect_to path_one and return

который хорошо читается.

Ответ 4

Стоит отметить, что нет необходимости return, если у вас нет кода после redirect_to, как в этом примере:

def show
  if can?(:show, :poll)
    redirect_to registrar_poll_url and return
  elsif can?(:show, Invoice)
    redirect_to registrar_invoices_url and return
  end
end

Ответ 5

Чтобы объединить пример "rubyish way" в ответе Eimantas с двумя строками кода:

return redirect_to(path_one) if some_condition

redirect_to(path_two)