Я пишу приложение rails 4.0.2, и пытаюсь получить уведомление о Flash, которое будет отображаться в моем представлении после события AJAX.
На мой взгляд, я показываю календарь с днями, на которые пользователь может нажать. Когда они это делают, я запускаю событие AJAX через обработчик события onclick, который обновляет мою модель, добавляя или удаляя запись. После запуска события я завершаю обновление страницы, чтобы отображать обновленные результаты.
Я обнаружил, что мне нужно было обновить страницу во время события JS click, чтобы получить представление для правильного обновления. Недостаточно перенаправления или рендеринга в контроллере.
Итак, для этого я установил уведомление Flash в своем контроллере...
def set_conflicts
@conflict = @member.conflicts.for_date(params[:date]).first
if @conflict
@conflict.destroy
else
conflict_date = Date.parse(params[:date])
unless Conflict.create(
month: conflict_date.month,
day: conflict_date.day,
year: conflict_date.year,
member: @member
)
flash[:alert] = 'Oops, there was a problem updating conflicts'
end
end
flash[:notice] = 'This is a test!'
redirect_to manage_member_conflicts_path(@member)
end
... и включили следующую логику отображения флэш-памяти в мой application.haml...
...
%body
= p flash.inspect
- flash.each do |type, message|
= content_tag(:div, message, :class => "flash-#{type}")
= render 'devise/menu/login_items'
= yield
Примечание. Я использую HAML вместо ERB в своих представлениях
Тем не менее, независимо от того, что я пытаюсь, сообщение Flash не отображается. Все остальное работает как ожидалось, кроме флеш-сообщения, и я не смог понять, почему.
Я подозреваю, что это связано с обновлением AJAX, которое я делаю в сочетании с переадресацией (и, возможно, даже с turbolinks), но я просмотрел другие ответы здесь на SO и просто не могу заставить его работать. Ясно, что я что-то пропустил.
Здесь JS-обработчик (это довольно просто):
window.calendarClick = (eventDate, linkURL) ->
event = $(document.getElementById(eventDate))
event.toggleClass('selected')
# Set or Remove conflicts
$.ajax
url: linkURL
data:
date: eventDate
# Refresh the page
$.ajax
url: '',
context: document.body,
success: (s,x) ->
$(this).html(s)