我想将我的应用程序置于维护模式,但仍然可以让管理员/版主登录并使用该网站。有两个原因:
我在应用中进行了一些更改,这些更改最适合使用应用内界面而不是控制台。
主持人无法访问控制台,但绝对可以帮助我们完成维护任务。
您如何推荐这样做?我一直在尝试设置一个环境变量ADMIN_MODE
并在它变为真时更改所有权限,但这看起来非常狡猾和缓慢。
我正在使用CanCan和Devise,这是值得的,但我绝对愿意接受任何建议。
谢谢!
答案 0 :(得分: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
答案 1 :(得分:3)
我认为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]
答案 2 :(得分: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年的某些人。