уведомление о вспышке, сохраняющееся в контроллере rails

#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, потому что он напрямую отвечает на заданный вопрос и объясняет поведение, которое было результатом моего кода.