Rails: режим обслуживания только для администратора - PullRequest
9 голосов
/ 13 июля 2011

Я бы хотел перевести свое приложение в режим обслуживания, но администраторы и модераторы могли бы войти и использовать сайт.Две причины:

  1. Я делаю некоторые изменения в приложении, которые лучше всего применять с помощью интерфейса в приложении, а не консоли.

  2. Модераторы не имеют доступа к консоли, но могут определенно помочь с задачами по обслуживанию, которые у нас впереди.

Как бы вы порекомендовали это сделать?Я экспериментировал с установкой переменной окружения ADMIN_MODE и изменением всех разрешений, когда она истинна, но это кажется довольно громоздким и медленным.

Я использую CanCan и Devise, для чего это стоит, ноЯ определенно открыт для любых предложений.

Спасибо!

Ответы [ 3 ]

11 голосов
/ 13 июля 2011

Вероятно, это будет довольно простое решение:

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
3 голосов
/ 13 июля 2011

Я думаю, что решение aNoble в порядке, другой способ может заключаться в том, чтобы заставить ваш веб-сервер сделать это, я использую задачу cap deploy:web:disable Capistrano, а затем 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 голосов
/ 31 мая 2015

Я сделал нечто подобное, что может быть полезно людям, которые все еще заинтересованы

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 в качестве своей страницы администратора. Надеюсь, что это поможет кому-то в 2015 году.

...