2011-07-13 29 views
9

我想让我的应用进入维护模式,但仍然有管理员/管理员能够登录并使用该站点。原因有两个:Rails:仅管理维护模式

  1. 我在应用程序中进行了一些最适合使用应用程序内界面而非控制台应用程序的更改。

  2. 版主无法访问控制台,但肯定可以帮助我们提前完成维护任务。

您会如何推荐此操作?我一直在尝试设置一个环境变量ADMIN_MODE,并在所有权限为true的情况下更改所有权限,但这看起来相当笨拙并且很慢。

我正在使用CanCan和Devise,因为它的价值,但我绝对愿意接受任何建议。

谢谢!

回答

11

这可能会是一个相当简单的解决方案:

class ApplicationController < ActionController::Base 
    before_filter :check_admin_mode 

    protected 

    def check_admin_mode 
    if ENV['ADMIN_MODE'] && controller_name != 'sessions' && !current_user.admin? 
     redirect_to '/maintenance.html' 
    end 
    end 
end 
+0

这看起来不错 - 我得到的唯一问题是我仍然需要能够让管理员/管理员登录,以防他们的会话在维护模式启用时过期。这似乎是阻止任何尚未登录的人成功登录。有关如何仅保留登录操作的任何建议? – Andrew

+0

我已经使用检查更新了代码,以排除Sessions控制器,如果您使用Devise,该控制器应该是正确的。 – aNoble

+0

好的,这个工程。唯一缺少的是你必须检查'current_user'是否存在,否则检查当前用户是admin将在current_user为零时失败。但是这种方法很有效,而且比我单独使用CanCan的速度快得多。谢谢!! – Andrew

3

我觉得aNoble的解决方案是好的,另一种可能是让你的web服务器要做到这一点,我使用Capistrano酒店的cap deploy:web:disable任务,然后mod_rewrite有条件地重定向无论是维护页面还是允许特定用户通过IP地址,但是您可以编写自己的条件。

# Redirect to system maintenance if exists - used by cap deploy:web:disable 
RewriteCond %{REQUEST_URI} !\.(css|jpg|png|gif)$ 
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.php -f 
# Allow me through 
RewriteCond %{REMOTE_ADDR} "!^XXX\.XXX\.XXX\.XXX" 
RewriteCond %{SCRIPT_FILENAME} !maintenance.php [NC] 
RewriteRule ^.*$ /system/maintenance.php [L] 
+0

这是一个好主意,谢谢保罗。我在Heroku上,所以我没有mod_rewrite功能,但这是一个很好的技术,可以在未来进行其他部署。 – Andrew

0

我没有类似的东西,这可能是人谁仍然有兴趣

class ApplicationController < ActionController::Base 
    before_filter :check_maintenance_mode 

    protected 

    def check_maintenance_mode 

    temp_var = self.class.to_s.split("::").first 

    return if temp_var.casecmp("admin") == 0 || temp_var.casecmp("activeadmin") == 0 

    if site_setting.maintenance_mode 
     redirect_to maintenance_path unless request.fullpath.include?(maintenance_path) 
    else 
     redirect_to root_path if request.fullpath.include?(maintenance_path) 
    end 

    end 

end 

首先是有用的,我所做的就是分裂的类名来获得模块名称或控制器的名字,我如果我正在进入管理员区域,则访问该方法将退出该方法。你不希望维护页面影响管理模块

其次,我检查维护模式,如果它真,我将用户重定向到维护页面,除非他们已经在页面本身。如果维护模式没有打开,用户将被重定向回root_path

Fyi,我使用activeadmin作为我的管理页面。希望这可以帮助别人在2015年。