Validate user permissions with CanCan API.
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
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