Arslan Ali
Arslan Ali

Reputation: 17802

Circular dependency detected while autoloading constant Concerns::<NameOfConcern>

Note: Before you think of marking this question as a duplicate of an other similar question, do note this thing that this question is being asked about concerns in Rails, while the other questions that I've searched deal with controllers. No question I've found out, that deals with concern.

I've a file named comments_deletion.rb inside app/models/concerns, and it contains the following code:

module CommentsDeletion
  extend ActiveSupport::Concern

  included do
    after_save :delete_comments, if: :soft_deleted?
  end

  def soft_deleted?
    status == 'deleted'
  end

  def delete_comments
    comments.each &:destroy
  end
end

And I'm trying to mix the file in my model by writing the following code:

class Employee < ActiveRecord::Base
  include CommentsDeletion
  # all the other code
end

Just doing this, and then upon invoking rails console, it gives me the following error:

Circular dependency detected while autoloading constant Concerns::CommentsDeletion

I'm using Rails 4.0.2, and this thing has driven me nuts, and I'm unable to figure out what's wrong with my code.

Upvotes: 3

Views: 992

Answers (2)

Bater
Bater

Reputation: 71

In my case, my code likes like:

#models/user.rb
class User < ApplicationRecord
  include User::AuditLog
end

and

#model/concern/user/audit_log.rb
module User::AuditLog
  extend ActiveSupport::Concern
end

it works fine in development environment, but in production it got error as title. When I change to this it works fine for me. Rename the folder name in concern if it has the same name with models.

#models/user.rb
class User < ApplicationRecord
  include Users::AuditLog
end

and

#model/concern/users/audit_log.rb
module Users::AuditLog
  extend ActiveSupport::Concern
end

Upvotes: 0

Arslan Ali
Arslan Ali

Reputation: 17802

Very strange that the following thing hasn't been mentioned anywhere in Rails documentation, but with it, my code works without any problems.

All you have to do is to replace CommentsDeletion with Concerns::CommentsDeletion. Put otherwise, you have to put Concerns before the name of your module that you would like to mix into your models later on.

Now, that's how my module residing inside concerns directory looks like:

module Concerns::CommentsDeletion
  extend ActiveSupport::Concern

  included do
    after_save :delete_comments, if: :soft_deleted?
  end

  def soft_deleted?
    status == 'deleted'
  end

  def delete_comments
    comments.each &:destroy
  end
end

Upvotes: 2

Related Questions