#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
У меня есть контроллер с методом обновления, который обновляет атрибут модели, устанавливает флэш-уведомление для пользователя в случае успеха, а затем снова отображает страницу редактирования. Следующая ссылка, по которой я нажимаю на то же уведомление о вспышке, появляется во второй раз, когда она загружает / отображает страницу. Что происходит? Как мне заставить flash [: notice] отображаться только один раз? Почему оно сохраняется в следующем ответе?
контроллер:
def update
respond_to do |format|
if @resource.update_attributes(params[:resource])
flash[:notice] = "Resource successfully updated"
format.html{ render :action => "edit" }
else
format.html{ render :action => "edit" }
end
end
end
Ответ №1:
Если вы хотите, чтобы флэш-уведомление отображалось немедленно, используйте flash.now[:notice]
вместо flash[:notice]
. Поведение по умолчанию заключается в сохранении flash до тех пор, пока не будет обработан последующий запрос, где now
версия очистит его после завершения текущего запроса.
Комментарии:
1. Спасибо. Этот ответ объясняет причину поведения, о котором я спрашивал.
Ответ №2:
Вы не должны использовать render
метод после успешного выпуска. Вместо этого попробуйте использовать redirect_to
:
respond_to do |format|
if @resource.update_attributes(params[:resource])
flash[:notice] = "Resource successfully updated"
format.html{ redirect_to :action => edit, :id => @resource }
else
format.html{ render :action => "edit" }
end
end
Для получения дополнительной информации о различиях между этими двумя методами ознакомьтесь с руководством Rails.
Комментарии:
1. Я понимаю различия между рендерингом / перенаправлением, и в основном казалось более прямым отображать представление шаблона, которое я хотел в этом случае, а не перенаправлять. (не требует обратного перехода к браузеру, и для нужного мне представления нет специального состояния). Итак, я задаюсь вопросом о вашем «не должен» выше. Это просто вопрос возможного повторения (или возникновения ошибок), если в будущем действие редактирования приведет к необходимости в специальном состоянии? (ala пример книг в вашей ссылке) Или есть другие соображения?
2. @Bee Одна из вещей, которая может вызвать некоторые проблемы, — это, например, добавление страницы в избранное. Можно было бы ожидать, что если вы добавите страницу в закладки с надписью «Это страница редактирования», когда вы посещаете ее, вы получаете страницу редактирования. В этом случае вы получите страницу показа. Вы также можете попробовать обновить страницы и посмотреть, что вы получите. Я помню, что читал хорошую статью об этой проблеме, но сейчас я не могу ее найти. Я свяжусь с ним в своих комментариях, когда найду его.
3. Спасибо за ответ @maro! Я не подумал о том, что нужно добавлять закладки, и, вероятно, из-за этого я перейду на перенаправление в своем приложении. Тем не менее, я собираюсь принять ответ @tadman, потому что он напрямую отвечает на заданный вопрос и объясняет поведение, которое было результатом моего кода.