我想把我的应用程序进入维护模式,但仍然有管理员/版主能够登录和使用该网站。
两个原因:
-
我在应用程序中做了一些改变,最好使用应用程序内的界面,而不是控制台。
-
版主不能访问控制台,但绝对可以帮助我们完成前面的维护任务。
你建议怎么做呢?我一直在尝试设置一个环境变量ADMIN_MODE
,并在它为真时更改所有权限,但这似乎相当模糊和缓慢。
我正在使用CanCan和design,但我绝对愿意接受任何建议。
这可能是一个相当简单的解决方案:
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
我认为anobble的解决方案是好的,另一种方法可能是让你的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]
我做了类似的事情,可能对那些仍然感兴趣的人有用
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供参考,我使用activeadmin作为我的管理页面。