Jerod Santo

Buy the truth, sell it not*
📡 RSS 📥 News 🖇️ LinkedIn 🐙 GitHub 📸 Instagram 📧 Contact 🎙️ 𝕏

Make ActiveAdmin and FriendlyId play nice

ActiveAdmin and FriendlyId are both handy gems, but they don’t play nice together out of the box.

This is because FriendlyId’d models don’t follow the default to_param style of id-based lookups which ActiveAdmin expects.

However, the two are easily reconciled by changing how ActiveAdmin fetches resources. Throw this in your ActiveAdmin initializer:

# config/initializers/active_admin.rb
ActiveAdmin::ResourceController.class_eval do
  def find_resource
    id_field = "id"

    if scoped_collection.is_a? FriendlyId
      id_field = scoped_collection.friendly_id_config.query_field
    end

    scoped_collection.find_by! id_field => params[:id]
  end
end

That’ll do it. You can alternatively define find_resource inside each registered resource’s controller block if you want to be picky.

There may be a better way to derive the id_field, but I don’t know it. Let me know if you do.