Ответ 1
Сессия
одно и то же уведомление сохраняется и при следующих кликах
Это вызвано тем, что flash
является хранящимся в переменной session
Rails:
Вспышка - это особая часть сеанса, которая очищается с каждой запрос. Это означает, что сохраненные там значения будут доступны только в следующий запрос, который полезен для передачи сообщений об ошибках и т.д.
Проблема заключается в том, что, поскольку я не думаю, что ajax считается новым запросом (нужна ссылка для этого), данные будут сохраняться в следующий раз, когда вы запрашиваете через HTTP.
-
Fix
Сначала я попытался бы это сделать:
def show
respond_to do |format|
format.js { flash[:notice] = "my secret number "+rand(0,5)+" !" }
end
end
Основная проблема заключается в том, что вы обрабатываете переменную flash
в JS, используя препроцессор ERB
. Это проблема, так как это означает, что вы не сможете использовать прекомпиляцию активов, чтобы помочь ей работать.
Посмотрев на этот вопрос, почему бы не попробовать использовать after_filter
callback, например:
#app/controllers/home_controller.rb
Class Home < ActionController::Base
after_filter { flash.discard if request.xhr? }, only: :show
def show
respond_to do |format|
format.js { flash[:notice] = "my secret number "+rand(0,5)+" !" }
end
end
end
-
Обновление
Вы должны включить функциональность success
в свой show.js.erb
:
#app/views/home/show.js.erb
$("#notice").html("<%= flash[:notice] %>");
Это означает, что вы можете удалить весь вызов ajax
из application.js
и заменить на remote: true
для своей формы поиска:
#app/views/search/index.html.erb
<%= form_tag home_show_path, remote: true %>
Причина этого в том, что, когда вы используете блок ответа format.js
, Rails загрузит файл [action].js.erb
в ваши представления. Учитывая, что это происходит только после завершения действия, это эквивалентно функции success
вашего ajax.
Посредством этого вы сможете удалить всю функцию ajax
из application.js
и заменить ее версией UJS, как описано выше