Переадресовывают ли redirect_to и обмениваются?

Для кода ниже, что произойдет, если заменить redirect_to на рендеринг или тиски?

def create @product = Product.new(params[:product]) respond_to do |format| if @product.save format.html { redirect_to(@product, :notice => 'Product was successfully created.') } else format.html { render :action => "new" } end end end 

Кажется, что ОК заменяет один на другой в коде выше. Есть ли место, где нужно использовать только redirect_to или render? Render делает только визуализацию. Redirect_to отправляет 302 запрос на сервер, а текущие параметры теряются после перенаправления.

Благодарю.

Если вы используете render , когда пользователь обновляет страницу, он снова отправит предыдущий запрос POST. Это может привести к нежелательным результатам, таким как повторная покупка и другие.

введите описание изображения здесь

Но если вы используете redirect_to , когда пользователь обновляет страницу, он просто попросит эту же страницу снова. Это также известно как шаблон Post / Redirect / Get (PRG) .

введите описание изображения здесь

Таким образом, место, где redirect_to должно использоваться, – это когда вы выполняете запрос HTTP POST, и вы не хотите, чтобы пользователь повторно отправлял запрос, когда он был сделан (что может привести к дублированию элементов и другим проблемам).

В Rails, когда модель не сохраняется, render используется для повторного отображения формы с теми же записями, которые были заполнены ранее. Это проще, потому что если вы используете redirect, вам придется передавать записи в форме, используя параметры или сеанс. Побочным эффектом является то, что если вы обновите браузер, он попытается повторно отправить предыдущие записи формы. Это приемлемо, потому что он, вероятно, потерпит неудачу таким же образом, или если он будет успешным сейчас, это то, что пользователь должен ожидать в первую очередь в любом случае.

Чтобы более подробно рассказать о render и redirect , вы должны прочитать эту статью .

При перенаправлении вы создадите новый запрос, который будет обращаться к методу controllerа, а рендер просто отобразит соответствующее представление. Вы используете рендеринг в создании, потому что хотите сохранить состояние объекта модели, если сбой сохраняется, так что вы можете отобразить информацию об ошибках. Если вы попытаетесь перенаправить путь new_product, вы создадите новый объект модели и потеряете все данные формы, введенные пользователем, и любые ошибки и т. Д. И т. Д.

EDIT (с дополнительной информацией):

Пример ситуации, когда вы ДОЛЖНЫ использовать redirect_to – это если в вашем шаблоне представления используются переменные экземпляра, которые не инициализируются в методе controllerа, с которого вы перенаправляете. Таким образом, вы, вероятно, не могли бы вызвать render {:action => 'index'} в вашем методе create, потому что шаблон индекса, вероятно, использует переменную @products но ваш единственный инициализированный @product так что это вызовет исключение

  • rails от многих до многих
  • Добавление lib в 'config.autoload_paths' в Rails 3 не выполняет автозагрузку моего модуля
  • путают autoload_paths vs eager_load_paths в рельсах 4
  • Отношение «многие ко многим» с той же моделью в рельсах?
  • Странная ошибка «406 неприемлема»
  • Rails: ссылки «Next post» и «Previous post» в моем представлении, как?
  • Полностью настраиваемое сообщение об ошибке проверки с Rails
  • Rails: Как работает блок response_to?
  • ActionController :: InvalidAuthenticityToken
  • has_and_belongs_to_many vs has_many через
  • Rails 4 link_to Destroy не работает в учебном руководстве по началу работы
  • Давайте будем гением компьютера.