1

注:この質問を他の同様の質問と重複していると考える前に、この質問にはRailsの懸念について質問されています。私が検索した他の質問はコントローラを扱います。私が見つけた疑問は、懸念を扱っている。自動ロード中に循環依存関係が検出される問題:: <NameOfConcern>

私は内部comments_deletion.rbapp/models/concernsという名前のファイルをしました、そして、それは次のコードが含まれます。

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 

そして、私は次のコードを書くことで、私のモデルにファイルをミックスしようとしていました:

ただ、これをやって
class Employee < ActiveRecord::Base 
    include CommentsDeletion 
    # all the other code 
end 

、その後、rails consoleを起動すると、それは私に次のエラーを与える:

Circular dependency detected while autoloading constant Concerns::CommentsDeletion 

私はRails 4.0.2を使用していますが、このことは私にはうんざりですが、私のコードに何が間違っているのか理解できません。

答えて

1

次のことは、Railsのドキュメントでは言及されていませんが、私のコードは問題なく動作します。

CommentsDeletionConcerns::CommentsDeletionに置き換えるだけで済みます。それ以外の場合は、あとでモデルに組み込みたいモジュール名の前にConcernsを入れなければなりません。

さて、それは私のモジュールが懸念ディレクトリ内に存在する方法ですが、以下のようになります。

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

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

それが動作します。私の場合は

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 
0

、私のコードは次のように好き開発環境はうまくいきますが、プロダクションではタイトルとして誤りがあります。私はこれに変更すると、それは私のためにうまく動作します。フォルダ名がモデルと同じ名前のフォルダ名の名前を変更します。

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

#model/concern/users/audit_log.rb 
module Users::AuditLog 
    extend ActiveSupport::Concern 
end 
関連する問題