Режим только для чтения для приложения Ruby on Rails - PullRequest
4 голосов
/ 03 августа 2010

У меня есть интерактивное приложение Ruby on Rails, которое я хотел бы перевести в режим «только чтение» в течение определенного времени.Это позволит пользователям читать нужные им данные, но блокировать их от действий, которые записывают в базу данных.

Один из способов сделать это - поместить переменную true / false в базу данных, которая была проверена перед выполнением любой записи.

Мой вопрос.Есть ли более элегантное решение этой проблемы?

Ответы [ 4 ]

12 голосов
/ 04 августа 2010

Если вы действительно хотите предотвратить любую запись в базу данных, самый простой способ, который я могу себе представить, это переопределить метод readonly? модели, чтобы всегда возвращать значение true, либо в выбранных моделях, либо, возможно, даже для всех моделей ActiveRecord. Если модель установлена ​​только для чтения (обычно это делается путем вызова #readonly! для нее), любая попытка сохранить запись вызовет ошибку ActiveRecord::ReadOnlyRecord.

module ActiveRecord
  class Base
    def readonly?
      true
    end
  end
end

(фактически непроверенный код, но вы поняли ...)

2 голосов
/ 03 августа 2010

Еще один хороший, который мне понравился немного лучше, это Декларативная авторизация который также распространяется на Railscasts: Railscasts - Декларативное разрешение

2 голосов
/ 03 августа 2010

Плагин разрешений? Что-то простое, например, cancan, где вы определяете, что и когда может делать пользователь. Это позволит вам отображать ссылки или нет, и ограничивать доступ к действиям контроллера. Railscast объяснит лучше, чем я.

http://github.com/ryanb/cancan

http://railscasts.com/episodes/192-authorization-with-cancan

0 голосов
/ 28 июня 2018

Ответ от Zargony будет работать хорошо, но возникнет исключение, если ваше приложение пытается что-то написать.Если вы хотите, чтобы ваше приложение молча провалилось при записи, чтобы оно не показывало страницы ошибок при каждой операции (например, если вы обновите временную метку при входе в систему в своем коде, вы получите исключение), вы можете использовать следующий подход:

   unless Rails.env.test?
      class ActiveRecord::Base
        before_save do
          raise ActiveRecord::Rollback, "Read-only"
        end

        before_destroy do
          raise ActiveRecord::Rollback, "Read-only"
        end
      end
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...