【发布时间】:2011-04-01 13:44:27
【问题描述】:
我在屏幕顶部呈现一个警告栏作为部分,向用户显示成功/失败/通知闪存消息。
我终于让它适用于大多数场景,但代码本身在某些部分是重复的,我不确定如何更有效地拆分它,因为我对所有这些都比较陌生。我的目标是尽可能不重复自己,或者至少尽量减少重复次数。
例如,有没有办法将一些 javascript 放入可重用的部分或辅助函数中?还有其他明显的方法可以减少这段代码的重复性吗?
我对 Rails/Ruby 还不够熟悉,无法理解如何改进代码,因此非常感谢您提供的任何提示!
/ top alert area
#topAlertBar.shadow_medium.soft-hidden
- if flash.empty? && !current_user.confirmed?
- # User has yet to confirm their account
- # and there AREN'T any flash messages to show
#alertBarOffset.colordark.soft-hidden
/ placeholder for alert bar offset
:javascript
// Set the flash box content
$('#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"))}.');
// Slides down the top alert bar after page load
$('#topAlertBar, #alertBarOffset').delay(250).slideDown("fast");
// 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) {
$(document).unbind('ajaxSend', 'ajaxComplete');
$("#topAlertBar img").hide();
});
});
- elsif !flash.empty? && !current_user.confirmed?
- # User has yet to confirm their account
- # and there ARE flash messages to show
#alertBarOffset.colordark.soft-hidden
/ placeholder for alert bar offset
- [:error, :success, :notice].each do |key|
- unless flash[key].blank?
- @msg = flash[key]
- @key = key
:javascript
// Set the flash box content
var $that = $('#topAlertBar');
$that.html('#{@msg}').addClass('#{@key}').delay(250).slideDown("fast", function() {
$(this).delay(2000).slideUp("fast", function () {
// Remove any CSS modifiers
$that.removeClass('#{@key}');
// Set the flash box content
$('#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"))}.');
// Slides down the top alert bar after page load
$('#topAlertBar, #alertBarOffset').slideDown("fast");
// 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) {
$(document).unbind('ajaxSend', 'ajaxComplete');
$("#topAlertBar img").hide();
});
});
});
});
- elsif !flash.empty?
- # User is confirmed
- # and there ARE flash messages to show
- [:error, :success, :notice].each do |key|
- unless flash[key].blank?
- @msg = flash[key]
- @key = key
:javascript
// Set the flash box content
var $that = $('#topAlertBar');
$that.html('#{@msg}').addClass('#{@key}').delay(250).slideDown("fast", function() {
$(this).delay(2000).slideUp("fast");
});
【问题讨论】:
-
顺便说一句,这个问题最初发布在codereview.stackexchange.com,但显然没有人真正去那里审查代码,所以我将它迁移回这里。
标签: jquery ruby-on-rails refactoring haml dry