Переадресация

Жизненный цикл приложения Rails разбит на запросы. При поступлении каждого нового запроса все начинается сначала.

Рендеринг шаблона, который подразумевается по умолчанию, является альтернативным, частичным, просто текстом или чем-нибудь еще – этопоследний шаг обработки запроса. Переадресация же означает, что обработка текущего запроса завершается, и начинается обработка нового.

Рассмотрим еще раз пример метода create для обработки формы:

def create
@event = Event.new(params[:event])
if @event.save
flash[:notice] = "Событие создано!"
redirect_to :controller => "main"
else
render :action => "new"
end
end

Если операция сохранения завершается успешно, мы записываем сообщение в хеш flash и вызываем метод redirect_to для перехода к совершенно другому действию. В данном случае это действие index (оно не задано явно, но принимается по умолчанию) контроллера main.

Смысл в том, что при сохранении записи о новом событии Event надлежит вернуть пользователя к представлению верхнего уровня. Так почему просто не выполнить рендеринг шаблона main/index.rhtml?

if @event.save
flash[:notice] = "Событие создано!"
render :controller => "main", :action => "index"
...

В результате действительно будет выполнен рендеринг шаблона main/index.rhtml. Но тут есть подводные камни. Предположим, например, что действие main/index выглядит следующим образом:

def index
@events = Event.find(:all)
end

Если выполнить рендеринг index.rhtml из действия event/create, то действие main/index не будет выполнено. Поэтому переменная @events останется неинициализированной. Следовательно, при рендеринге index.rhtml возникнет ошибка, так как в этом шаблоне (предположительно) используется @events:


<h1>Schedule Manager</h1>
<p>Текущий список ваших событий:</p>
<% @events.each do |event| %>
здесь какая-то HTML-разметка
<% end %>

 

Вот почему мы должны выполнить переадресацию на действие main/index,а не просто позаимствовать его шаблон. Команда redirect_to начнет все с чистого листа: создаст новый запрос, инициирует новое действие и решит, по какому шаблону выводить ответ.

 

КОММЕНТАРИИ