干燥一些Rails/HAML/jQuery视图代码
我在屏幕顶部呈现一个警报条作为一个部分,向用户显示成功/失败/注意闪光消息 我终于让它适用于大多数场景,但代码本身在一些部分是重复的,我不确定如何更有效地拆分它,因为我对所有这些都比较陌生。我的目标是尽可能不重复我自己,或者至少尽量减少重复的次数 例如,有没有办法将一些javascript放入可重用的部分或辅助函数中?有没有其他明显的方法可以减少代码的重复性 我对Rails/Ruby还不够熟悉,无法理解如何改进代码,因此非常感谢您提供的任何提示干燥一些Rails/HAML/jQuery视图代码,jquery,ruby-on-rails,refactoring,haml,dry,Jquery,Ruby On Rails,Refactoring,Haml,Dry,我在屏幕顶部呈现一个警报条作为一个部分,向用户显示成功/失败/注意闪光消息 我终于让它适用于大多数场景,但代码本身在一些部分是重复的,我不确定如何更有效地拆分它,因为我对所有这些都比较陌生。我的目标是尽可能不重复我自己,或者至少尽量减少重复的次数 例如,有没有办法将一些javascript放入可重用的部分或辅助函数中?有没有其他明显的方法可以减少代码的重复性 我对Rails/Ruby还不够熟悉,无法理解如何改进代码,因此非常感谢您提供的任何提示 / top alert area #topAler
/ 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");
});
为什么要为用户确认的所有不同状态而烦恼呢?如果用户未确认,只需让您的应用程序控制器设置一个闪存警报 其次——将所有jquery移动到application.js并在每个页面上运行——如果内容存在,它应该向下滑动,否则什么也不做 最后,抓取一个flash助手,如下所示:然后在布局中调用它,如
%head
%titile
=javascript_include_tag :all
=yield(:header)
%body
=display_flash
=yield
我最终采取了与Jesse推荐的不同的方法,但他仍然帮助我思考重构代码的方法。这里是最终的结果,这是干我可以得到它不完全改变如何我已经实现了 希望这能帮助将来偶然发现这个问题的其他人
在我的ApplicationHelper中(这在某种程度上是从原始问题修改而来的,因此它现在适用于我的验证错误以及常规flash消息) 在我的主布局文件中,我只是在做:
%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') : ""}
});
});
/* ******************************** */
/* 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');
});
在确认用户部分中
: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文件中
= 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') : ""}
});
});
/* ******************************** */
/* 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');
});
})) 顺便说一句,这个问题最初是发布在上的,但显然没有人真正去那里查看代码,所以我将它迁移回这里。如果我不在HAML jQuery代码中设置Ruby对象,部分问题对我来说是可行的:
$that.html('.{@msg}').addClass('.{@key}')
。但是,因为这个原因,我不确定你的解决方案是否对我有效。你不需要这样做。Jesse,只要让jquery抓取内容(如果有的话)谢谢你的建议;他们今天早上帮我动了脑子。最后我做的有点不同,因为我不想重新创建我已有的系统。