В итоге я выбрал другой подход, чем тот, который рекомендовал Джесси, но он все же помог мне подумать о способах рефакторинга кода.Вот конечный результат, который настолько СУХОЙ, насколько я мог его получить, не меняя полностью то, как я его уже реализовал.
Надеюсь, это поможет кому-то еще, кто наткнется на этот вопрос в будущем.
В моем ApplicationHelper (это несколько изменено по сравнению с первоначальным вопросом, поэтому теперь оно работает для моих ошибок проверки, а также для обычных флэш-сообщений)
def display_flash_messages
if !flash.empty?
[:error, :success, :notice, :warning].each do |key|
unless flash[key].blank?
@flash_key = key
if flash[key].kind_of?(Array) && flash[key].size > 1
@flash_msg = flash[key].join(' & ')
elsif flash[key].kind_of?(Array) && flash[key].size == 1
@flash_msg = flash[key].first
elsif flash[key].kind_of?(String)
@flash_msg = flash[key]
end
end
end
end
return
end
Inмой основной файл макета, я просто делаю:
%body
- if signed_in?
= render 'shared/top_alert_bar'
В верхнем файле панели предупреждений
= display_flash_messages
/ top alert area
#topAlertBar.shadow_medium.soft-hidden
- if !current_user.confirmed?
#alertBarOffset.colordark.soft-hidden
/ placeholder for alert bar offset
- if flash.empty? && !current_user.confirmed?
- # User has yet to confirm their account
- # and there AREN'T any flash messages to show
:javascript
#{render('shared/js/confirm_user')}
- elsif !flash.empty?
:javascript
// Set the flash box content
var $that = $('#topAlertBar');
$that.html('#{@flash_msg}').addClass('#{@flash_key}').delay(250).slideDown("fast", function() {
$(this).delay(4000).slideUp("fast", function () {
// Remove any CSS modifiers
$that.removeClass('#{@flash_key}');
#{!current_user.confirmed? ? render('shared/js/confirm_user') : ""}
});
});
В Подтверждении_пользователячастичный
:plain
$('#topAlertBar').html('Please confirm your account by following the instructions sent to #{current_user.email}. To resend your confirmation email, #{escape_javascript(link_to('click here', user_resend_confirmation_path(current_user), :class => 'inlinelink', :method => :post, :remote => true))}. #{escape_javascript(image_tag('ajaxOrange.gif', :class => 'soft-hidden mls mbs'))}');
$('#topAlertBar, #alertBarOffset').delay(250).slideDown('fast');
И, наконец, я переместил это в свой основной файл js
/* ******************************** */
/* Top Alert Bar for Flash Messages */
/* ******************************** */
// Description: Shows & hides AJAX loading GIF when necessary
$('#topAlertBar a').click(function() {
$(document).bind('ajaxSend', function(e, request, options) {
$("#topAlertBar img").show();
});
$(document).bind('ajaxComplete', function(e, request, options) {
$("#topAlertBar img").hide();
$(document).unbind('ajaxSend', 'ajaxComplete');
});
});