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

Переадресовывают ли 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 запрос на сервер, а текущие параметры теряются после перенаправления.

Спасибо.

4b9b3361

Ответ 1

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

enter image description here

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

enter image description here

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

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

Для более подробного объяснения render и redirect вы должны прочитать эту статью .

Ответ 2

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

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

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