activemodel-can_validator

Build Status Code Climate Coverage Status Dependency Status

Validate user permissions with CanCan API.

Usage

Add to your Gemfile:

gem 'activemodel-can_validator'

Run:

bundle install

Then add the followng to your model which belongs to a user:

validates :user, can: { create: true }, on: :create

Sample

A user can retweet other users' tweets unless she is blocked by the user.

class User < ActiveRecord::Base
  has_many :retweets

  def block?(user)
    blocking_users.include?(user)
  end

  delegate :can?, :cannot?, to: :ability

  def ability
    @ability ||= Ability.new(self)
  end

  class Ability
    include CanCan::Ability

    def initialize(user)
      user ||= User.new

      can :create, Retweet do |retweet|
        !retweet.tweet.user.block?(user)
      end
    end
  end
end

class Tweet < ActiveRecord::Base
  belongs_to :user
end

class Retweet < ActiveRecord::Base
  belongs_to :user
  belongs_to :tweet
  validates :user, presence: true, can: { create: true }, on: :create
end