๐งฉ ConcernsOnRails
๐ป๐ณ Note: Hoร ng Sa and Trฦฐแปng Sa belong to Viแปt Nam.
A simple collection of reusable Rails concerns to keep your models clean and DRY.
โจ Features
- โ
Sluggable: Generate friendly slugs from a specified field - ๐ข
Sortable: Sort records based on a field usingacts_as_list, with flexible sorting field and direction - ๐ค
Publishable: Easily manage published/unpublished records using a simplepublished_atfield - โ
SoftDeletable: Soft delete records using a configurable timestamp field (e.g.,deleted_at) with automatic scoping
๐ฆ Installation
Add this line to your application's Gemfile:
gem 'concerns_on_rails', github: 'VSN2015/concerns_on_rails'
Then execute:
bundle install
๐ Usage
1. ๐ Sluggable
Add slugs based on a specified attribute.
class Post < ApplicationRecord
include ConcernsOnRails::Sluggable
sluggable_by :title
end
post = Post.create!(title: "Hello World")
post.slug # => "hello-world"
If the slug source is changed, the slug will auto-update.
2. ๐ข Sortable
Use for models that need ordering.
class Task < ApplicationRecord
include ConcernsOnRails::Sortable
sortable_by :position
end
Task.create!(name: "B")
Task.create!(name: "A")
Task.first.name # => "B" (sorted by position ASC)
You can customize the sort field and direction:
class PriorityTask < ApplicationRecord
include ConcernsOnRails::Sortable
sortable_by priority: :desc
end
Additional features:
- ๐ Automatically sets
acts_as_liston the configured column - ๐ Adds default sorting scope to your model
- โ๏ธ Supports custom direction:
:ascor:desc - ๐ Validates that the sortable field exists in the table schema
- ๐ง Compatible with scopes and ActiveRecord queries
- ๐ Can be reconfigured dynamically within the model using
sortable_by
3. ๐ค Publishable
Manage published/unpublished records using a published_at field.
class Article < ApplicationRecord
include ConcernsOnRails::Publishable
end
Article.published # => returns only published articles
Article.unpublished # => returns only unpublished articles
article = Article.create!(title: "Draft")
article.published? # => false
article.publish!
article.published? # => true
article.unpublish!
article.published? # => false
Additional features:
- โ
published?returns true ifpublished_atis present and in the past - ๐
publish!setspublished_atto current time - ๐ซ
unpublish!setspublished_attonil - ๐ Add scopes:
.published,.unpublished, and a default scope (optional) - ๐ฐ Ideal for blog posts, articles, or any content that toggles visibility
- ๐งฉ Lightweight and non-invasive
- ๐งช Easy to test and override in custom implementations
4. โ SoftDeletable
Soft delete records using a timestamp field (default: deleted_at).
class User < ApplicationRecord
include ConcernsOnRails::SoftDeletable
soft_deletable_by :deleted_at
end
user = User.create!(name: "Alice")
user.soft_delete!
user.deleted? # => true
User.without_deleted # => returns only active users
User.soft_deleted # => returns soft-deleted users
User.all # => returns only non-deleted by default (default_scope applied)
user.restore!
user.deleted? # => false
Additional features:
- Default field is
deleted_at, can be configured - Automatically applies
default_scopeto hide soft-deleted records - Scopes:
without_deleted,soft_deleted,active - Methods:
soft_delete!,restore!,deleted?,really_delete! - Callbacks:
before_soft_delete,after_soft_delete,before_restore,after_restore - Touch support when soft deleting or restoring (can be turned off)
- Aliases for
deleted?:soft_deleted?,is_soft_deleted?
๐ ๏ธ Development
To build the gem:
gem build concerns_on_rails.gemspec
To install locally:
gem install ./concerns_on_rails-1.0.0.gem
๐ค Contributing
Bug reports and pull requests are welcome!
๐ License
This project is licensed under the MIT License.
๐ป๐ณ Hoร ng Sa and Trฦฐแปng Sa belong to Viแปt Nam.
๐ Source Code
The source code is available on GitHub:
๐ https://github.com/VSN2015/concerns_on_rails
Feel free to star โญ๏ธ, fork ๐ด, or contribute with issues and PRs.