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)
?
Ответы
Ответ 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)