Вот полный список двух методов, которым я следую:
1) redirect_to выдаст код состояния HTTP 302 по умолчанию.Перенаправление 302 является временным изменением и перенаправляет пользователей и поисковые системы на нужную страницу в течение ограниченного периода времени, пока она не будет удалена.При желании вы можете указать код статуса 301 для redirect_to.Код состояния 301 используется, когда какая-либо страница была навсегда перемещена в другое место.Теперь пользователи увидят новую страницу, поскольку она заменила старую.Это изменит URL-адрес страницы при отображении в результатах поиска.
2) redirect_to выдаст новый HTTP-запрос, поскольку он перенаправляет на другое действие контроллера или URL-адрес.Вы не должны заставлять браузер совершать новый вызов, если только вам это не нужно, поэтому всегда задавайте вопросы, когда вы используете redirect_to и правильно ли это, или, возможно, визуализация будет лучше.- redirect_to приведет к пропуску любого автоматического рендеринга шаблона текущего действия.
3) рендер выдаст код состояния HTTP 200 по умолчанию (но с недопустимым объектом ActiveRecord вы можете изменить его на 422).не обрабатываемый объект).Код ответа HTTP 200 OK об успешном статусе указывает, что запрос выполнен успешно.Код состояния 422 (Unprocessable Entity) означает, что сервер понимает тип содержимого объекта запроса, и синтаксис объекта запроса является правильным, но не смог обработать содержащиеся в нем инструкции.
4) рендеринг отобразит шаблони любые переменные экземпляра, определенные в действии контроллера, будут доступны в шаблоне.Конечно, переменные экземпляра не будут доступны, если последующее действие, которое вызывает redirect_to.ВАЖНАЯ ТОЧКА: Перенаправление попадает в контроллер, а Render - нет, поэтому, если вы рендерите другой шаблон, он не будет воздействовать на действие, связанное с этим шаблоном, и поэтому эти переменные экземпляра будут недоступны!
5) С render, используйте flash.now, вместо обычной вспышки.
flash.now[:error] = "There was a problem"
# not
flash[:error] = "There was a problem"
6) Если вы этого не сделаете, то флэш-сообщение может не отображаться на отображаемой странице и будет отображаться на следующей посещенной странице.
7) рендер не приведет к прекращению выполнения текущего действия!redirect_to не приведет к прекращению выполнения текущего действия!Вам нужно вызвать 'return', если вам нужно обойти дальнейшее выполнение кода в действии!В приведенном ниже коде есть явный рендер в нижней части, поэтому вы должны выполнить возврат, чтобы избежать ошибки перенаправления и рендеринга при наличии обоих:
def update
@record = Record.new(record_params)
if @record.save
flash[:success] = "record was successfully saved"
redirect_to records_path
return
end
flash.now[:error] = "please fix the problems in the record"
render :edit
end
Другой вариант:
def update
@record = Record.new(record_params)
if @record.save
flash[:success] = "record was successfully saved"
redirect_to records_path
else
flash.now[:error] = "please fix the problems in the record"
render :edit
end
end
8) Флэш-сообщение обеспечивает способ передачи временных примитивных типов (String, Array, Hash) между действиями.Все, что вы поместите во вспышку, будет подвергнуто следующему действию, а затем очищено.Это отличный способ создания уведомлений и оповещений:
class PostsController < ActionController::Base
def create
# save post
flash[:notice] = "Post successfully created"
redirect_to @post
end
def show
# doesn't need to assign the flash notice to the template, that's done automatically
end
end
show.html.erb
<% if flash[:notice] %>
<div class="notice"><%= flash[:notice] %></div>
<% end %>
Поскольку во флэш-памяти могут быть как уведомления, так и предупреждения, вы можете отображать уведомления и оповещения следующим образом:
<% flash.each do |key, value| %>
<%= content_tag :div, value, class: "flash #{key}" %>
<% end %>