Back to Cancancan

FriendlyId

docs/friendly_id.md

3.6.0982 B
Original Source

FriendlyId

If you are using FriendlyId you will probably like something to make CanCanCan compatible with it.

You do not have to write find_by :slug or something like that, that is always error prone.

You just need to create a config/initializers/cancancan.rb file with:

ruby
if defined?(CanCanCan)
  class Object
    def metaclass
      class << self; self; end
    end
  end

  module CanCan
    module ModelAdapters
      class ActiveRecordAdapter < AbstractAdapter
        @@friendly_support = {}

        def self.find(model_class, id)
          klass =
          model_class.metaclass.ancestors.include?(ActiveRecord::Associations::CollectionProxy) ?
            model_class.klass : model_class
          @@friendly_support[klass]||=klass.metaclass.ancestors.include?(FriendlyId)
          @@friendly_support[klass] == true ? model_class.friendly.find(id) : model_class.find(id)
        end
      end
    end
  end
end