Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ledermann/rails-settings

Manage settings with Ruby on Rails
https://github.com/ledermann/rails-settings

configuration rails ruby rubygems settings

Last synced: about 2 months ago
JSON representation

Manage settings with Ruby on Rails

Awesome Lists containing this project

README

        

# Settings for Rails

[![Build Status](https://github.com/ledermann/rails-settings/actions/workflows/main.yml/badge.svg)](https://github.com/ledermann/rails-settings/actions)
[![Code Climate](https://codeclimate.com/github/ledermann/rails-settings.svg)](https://codeclimate.com/github/ledermann/rails-settings)
[![Coverage Status](https://coveralls.io/repos/ledermann/rails-settings/badge.svg?branch=master)](https://coveralls.io/r/ledermann/rails-settings?branch=master)

Ruby gem to handle settings for ActiveRecord instances by storing them as serialized Hash in a separate database table. Namespaces and defaults included.

## Requirements

- Ruby 2.7 or newer
- Rails 6.1 or newer (including Rails 7.0)

## Installation

Include the gem in your Gemfile and run `bundle` to install it:

```ruby
gem 'ledermann-rails-settings'
```

Generate and run the migration:

```shell
rails g rails_settings:migration
rake db:migrate
```

## Usage

### Define settings

```ruby
class User < ActiveRecord::Base
has_settings do |s|
s.key :dashboard, :defaults => { :theme => 'blue', :view => 'monthly', :filter => false }
s.key :calendar, :defaults => { :scope => 'company'}
end
end
```

If no defaults are needed, a simplified syntax can be used:

```ruby
class User < ActiveRecord::Base
has_settings :dashboard, :calendar
end
```

Every setting is handled by the class `RailsSettings::SettingObject`. You can use your own class, e.g. for validations:

```ruby
class Project < ActiveRecord::Base
has_settings :info, :class_name => 'ProjectSettingObject'
end

class ProjectSettingObject < RailsSettings::SettingObject
validate do
unless self.owner_name.present? && self.owner_name.is_a?(String)
errors.add(:base, "Owner name is missing")
end
end
end
```

In case you need to define settings separatedly for the same models, you can use the persistent option

```ruby
module UserDashboardConcern
extend ActiveSupport::Concern

included do
has_settings persistent: true do |s|
s.key :dashboard
end
end
end

class User < ActiveRecord::Base
has_settings persistent: true do |s|
s.key :calendar
end
end
```

### Set settings

```ruby
user = User.find(1)
user.settings(:dashboard).theme = 'black'
user.settings(:calendar).scope = 'all'
user.settings(:calendar).display = 'daily'
user.save! # saves new or changed settings, too
```

or

```ruby
user = User.find(1)
user.settings(:dashboard).update! :theme => 'black'
user.settings(:calendar).update! :scope => 'all', :display => 'daily'
```

### Get settings

```ruby
user = User.find(1)
user.settings(:dashboard).theme
# => 'black

user.settings(:dashboard).view
# => 'monthly' (it's the default)

user.settings(:calendar).scope
# => 'all'
```

### Delete settings

```ruby
user = User.find(1)
user.settings(:dashboard).update! :theme => nil

user.settings(:dashboard).view = nil
user.settings(:dashboard).save!
```

### Using scopes

```ruby
User.with_settings
# => all users having any setting

User.without_settings
# => all users without having any setting

User.with_settings_for(:calendar)
# => all users having a setting for 'calendar'

User.without_settings_for(:calendar)
# => all users without having settings for 'calendar'
```

### Eager Loading

```ruby
User.includes(:setting_objects)
# => Eager load setting_objects when querying many users
```

## Compatibility

Version 2 is a complete rewrite and has a new DSL, so it's **not** compatible with Version 1. In addition, Rails 2.3 is not supported anymore. But the database schema is unchanged, so you can continue to use the data created by 1.x, no conversion is needed.

If you don't want to upgrade, you find the old version in the [1.x](https://github.com/ledermann/rails-settings/commits/1.x) branch. But don't expect any updates there.

## Changelog

See https://github.com/ledermann/rails-settings/releases

## License

MIT License

Copyright (c) 2012-2024 [Georg Ledermann](https://ledermann.dev)

This gem is a complete rewrite of [rails-settings](https://github.com/Squeegy/rails-settings) by [Alex Wayne](https://github.com/Squeegy)