Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jereinhardt/feste
Email subscription management for Rails applications
https://github.com/jereinhardt/feste
email rails ruby subscription
Last synced: 3 months ago
JSON representation
Email subscription management for Rails applications
- Host: GitHub
- URL: https://github.com/jereinhardt/feste
- Owner: jereinhardt
- License: mit
- Created: 2017-10-13T21:31:30.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2020-12-21T15:16:27.000Z (about 4 years ago)
- Last Synced: 2024-10-01T15:53:04.968Z (4 months ago)
- Topics: email, rails, ruby, subscription
- Language: Ruby
- Size: 249 KB
- Stars: 11
- Watchers: 1
- Forks: 2
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
:email: Feste is an easy way to give your users the ability to manage email subscriptions in your Rails application.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'feste'
```And then execute:
$ bundle install
$ rails generate feste:install
$ rake db:migrateOnce installed, you will need to mount Feste in your application.
```ruby
# config/routes.rb
mount Feste::Engine => "/email-subscriptions", as: "feste"
```## Configuration
Feste organizes subscribable emails by separating them into categories that you define (see Mailer for more details). This requires an array of available categories (represented by symbols) to be provided to the `categories` configuration.
Out of the box, Feste allows your users to manage their subscriptions from a url in their email, which includes an identifying token. If you would like for them to be able to do so from within your application, you will need to provide a method for identifying the currently logged in user. Luckily, Feste provides authentication adapters for applications that use Devise and Clearance to manage user sessions. Otherwise, you can provide a Proc to the `authenticate_with` option.
Optionally, you can set the attribute your user model(s) use(s) to reference a user's email address (`email_source`) and the host that is used by the `subscriptions_url` helper (`host`).
```ruby
# initializers/feste.rb
authentication_method = Proc.new do |controller|
::User.find_by(id: controller.session[:user_id])
endFeste.configure do |config|
# set your category names
config.categories = [:marketing_emails, :reminder_emails]
# for applications that use clearance
config.authenticate_with = :clearance
# for applications that use devise
config.authenticate_with = :devise
# for applications that use custom authentication
config.authenticate_with = authentication_method
# set the email attribute of your user model
config.email_source = :email
# set the host for subscription_url
config.host = ActionMailer::Base.default_url_options[:host]
# set callbacks
config.callback_handler = FesteCallbackHandler.new
end
```
## Usage### Model
In the model that holds your users' data, include `Feste::User`.
```ruby
class User < ApplicationRecord
include Feste::User
end
```This will give your user model a `has_many` relationship to `subscriptions`. Since this relationship is polymorphic, your can include the `Feste::User` module in multiple models.
### Mailer
In your mailer, include the `Feste::Mailer` module.
Feste keeps track of email subscriptions by grouping mailer actions into categories that you define. Your users will not be able to subscribe or unsubscribe to emails until you assign specific actions to a category. In order to do this, you can call the `categorize` method within your mailer. Doing so will automatically assign all actions in that mailer to the category you provide through the `as` option.
When calling the `mail` method within an action, make sure to explicitly state which user the subscription should be applied to using the `subscriber` option.
```ruby
class CouponMailer < ApplicationMailer
include Feste::Mailercategorize as: :marketing_emails
def send_coupon(user)
mail(to: user.email, from: "[email protected]", subscriber: user)
end
end
```If you only want to categorize specific actions in a mailer, you can do so by listing those actions in an array as your first arguement.
```ruby
class CouponMailer < ApplicationMailer
include Feste::Mailercategorize [:send_coupon], as: :marketing_emails
categorize [:send_coupon_reminder], as: :reminder_emailsdef send_coupon(user)
mail(to: user.email, from: "[email protected]", subscriber: user)
enddef send_coupon_reminder(user)
mail(to: user.email, from: "[email protected]", subscriber: user)
end
end
```### View
#### Mailer View
In our view file, you can use the helper method `subscription_url` to link to the page where users can manage their subscriptions.
```html
click here to unsubscribe
```When a user clicks this link, they are taken to a page that allows them to choose which emails (by category) they would like to keep receiving, and which ones they would like to unsubscribe to.
#### Application View
The route to the subscriptions page is the root of the feste engine. You can link to this page from anywhere in your app using the `feste.subscriptions_url` helper (assuming the engine is mounted as 'feste'). When a logged in user visits this page from your application, they will be authenticated through the method which you provide in the configuration, and shown their email subscriptions.
### Human Readable Category Names
In order to create category names that are human readable, add a `feste.categories`section to your i18n `locales` files. Create keys in this section that correspond to the `categories` configuration.
```yml
# config/locales/en.ymlen:
feste:
categories:
marketing_emails: Marketing Emails
reminder_emails: Reminder Emails
```### When not to use
It is recommended you DO NOT include any important emails, such as password reset emails, into a subscribable category. It is also recommended you do not include the subscription link in any email that is sent to multiple recipients. Though Feste comes with some security measures, it is assumed that each email is intended for only one recipient, and the `subscription_url` helper leads to a subsciption page meant only for that recipient. Exposing this page to other users may allow them to change subscription preferences for someone else's account.
## Callbacks
If you would like to create callbacks for when a user unsubscribes or resubscribes to a mailing list, you can do so by creating a callback handler. Callback handlers should be objects with two instance methods: `unsubscribe` and `resubscribe`. You can register an instance of this object as your callback handler with the `callback_handler` configuration option.
```ruby
# config/initializers/feste.rbclass CallbackHandler
def unsubscribe(event)
# This method is called whenever a user unsubscribes from an mailing list they were previously subscribed to.
event[:controller] # the instance of the controller
event[:subscriber] # the user that unsubscribed
enddef resubscribe(event)
# This method is called whenever a user subscribes to a mailing list they were previously unsubscribed to.
end
endFeste.configure do |config|
config.callback_handler = CallbackHandler.new
end
```## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/jereinhardt/feste.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
l create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).