Rails:仅限管理员维护模式

我想将我的应用程序置于维护模式,但仍然可以让管理员/版主登录并使用该网站。 两个原因:

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

  2. 版主无法访问控制台,但绝对有助于我们面前的维护任务。

你会怎么推荐这样做? 我一直在尝试设置一个环境变量ADMIN_MODE并在它为真时更改所有权限,但这看起来很匆匆而且很慢。

我正在使用CanCan和Devise,这是值得的,但我绝对乐于接受任何建议。

谢谢!

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

 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 

我认为aNoble的解决方案很好,另一种方法可能是让你的网络服务器执行此操作,我使用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] 

我做了类似的事情,对于仍然感兴趣的人可能有用

 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年的某些人。