0.01
No commit activity in last 3 years
No release in over 3 years
Simple ActiveRecord audit system
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

 Project Readme

chrno_audit

Простейшая реализация аудита для ActiveRecord.

Установка

Добавьте в Gemfile:

gem "chrno_audit"

и запустите bundle install. Затем нужно будет сгенерировать необходимые для работы файлы и создать таблицы в БД:

rails g chrno_audit:install
rake db:migrate

Помните, что необходимо перезапустить приложение, если оно уже запущено.

Пример использования

Модель

После установки джема в моделях становится доступен метод audit( *params ), подключающий модель к системе аудита. В качестве параметров методу audit можно передавать список полей для аудита (по умолчанию все), например:

class Page < ActiveRecord::Base
  audit :text, :subject
end

Можно использовать псевдо-поле :all, если необходим аудит всех полей:

class Page < ActiveRecord::Base
  audit :all
end

Можно указывать список полей, которые необходимо игнорировать при аудите:

class Page < ActiveRecord::Base
  audit :all, :except => [ :author ]
end

Можно указать список действий для аудита (create, update, destroy):

class Page < ActiveRecord::Base
  audit :all, :when => [ :create ]
end

Контроллер

После установки джема в контроллерах становятся доступны следующие методы:

  • audit_context( proc_or_symbol = nil, &block ): задаёт контекст аудита;
  • create_audit_record!( context = {}, initiator = nil ): создаёт запись в логе для текущего экшена;

Cохраняем в контексте текущего пользователя и его IP:

class ApplicationController < ActionController::Base
  audit_context -> {{ ip: request.remote_addr, current_user: current_user }}
end

NB: блок исполняется в контексте контроллера и обязан возврашать хеш!

Используем метод для генерации контекста:

class ApplicationController < ActionController::Base
  audit_context :generate_context

  def generate_context
    { ip: request.remote_addr }
  end
end

class MyController < ApplicationController
  def generate_context
    super.merge { foo: "bar" }
  end
end

Генерируем запись в аудит-логе:

...
def some_action
  create_audit_record!({ foo: "bar" }, current_user )
end
...

В качестве auditable_type будет использовано имя контроллера, а в качестве action — имя экшена ("some_action").