Вместо вызова render
вы можете redirect_to
страницу редактирования и использовать flash
для отслеживания модели:
def update
# ...
if !@model.save # there was an error!
flash[:model] = @model
redirect_to :action => :edit
end
end
А затем в действии edit
вы можетеперезагрузите значения из flash[:model]
, то есть:
def edit
if flash[:model]
@model = flash[:model]
else
@model = ... # load model normally
end
end
Обновление:
Как прокомментировано ниже, я думаю, что когда я писал этот ответ, я пытался предоставить способ как обновить URL(что требует перенаправления) и сохранить измененные атрибуты модели, поэтому модель была сохранена во флэш-памяти.Однако вставлять модель во флэш-память - довольно плохая идея (и в более поздних версиях Rails она все равно будет десериализована), и для маршрутов RESTful не требуется, чтобы URL содержал edit
.
Обычным шаблоном было бы просто отобразить действие редактирования с моделью, уже находящейся в памяти, и отказаться от «идеального» URL:
def update
# Assign attributes to the model from form params
if @model.save
redirect_to action: :index
else
render :edit
end
end
В качестве альтернативы, если предпочтительнее иметь «идеальный» URL ивам не нужно поддерживать измененные атрибуты, которые не прошли проверку, см. ответ @ jamesmarkcook.