web-dev-qa-db-ja.com

Rails ActiveSuppport:Concern and Private Methods

これは、Railsの懸念についての素晴らしいアイデアです: http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

また、パブリックAPIの一部ではない非常に小さなメソッドを作成することもお勧めします。懸念を使用せずに、それらはRubyクラスのプライベートメソッドになります。

Rails ActiveSupport :: Concernモジュール内にプライベートメソッドを作成することは理にかなっていますか?そうであれば、プライベートは、懸念定義の通常のインスタンスメソッドとクラスメソッドの両方で機能しますか?

23
justingordon

Rails ActiveSupport::Concernモジュール内にプライベートメソッドを作成することは理にかなっていますか?

懸念事項が最終的に他のクラスに含まれるスマートモジュールであることを考えると、そうです。これは単なる移植可能なコードであり、抽出可能な動作であり、私が書いているときに、コントローラー(またはモデルなど)の一部と見なしたいと思います。したがって、基本的には、通常どおりにメソッドprivateまたはprotectedを宣言するだけです。

たぶん あなたがリンクした投稿 は2013年から更新されていますが、DHHはそこにある例の1つでまさにそれを行っています:

module Dropboxed
  extend ActiveSupport::Concern

  included do
    before_create :generate_dropbox_key
  end

  def rekey_dropbox
    generate_dropbox_key
    save!
  end

  private # <- Let's list some privates

  def generate_dropbox_key
    self.dropbox_key = SignalId::Token.unique(24) do |key| 
      self.class.find_by_dropbox_key(key)
    end
  end
end

privateクラスメソッドに関しては、@ Hugoに同意し、自分で使用したことはありませんが、これを実現する方法は次のとおりです。

module Dropboxed
  extend ActiveSupport::Concern

  included do
    private_class_method :method_name
  end

  module ClassMethods
    def method_name
    end
  end
end
27
jibiel

それは私の意見ですが、今私はプライベートクラスのメソッドについて頭を悩ませています、それらは何に適していますか?とにかく、本当に必要な場合は、この投稿を参照してください: プライベートクラスメソッドを作成する方法は?

懸念モジュールにプライベートインスタンスメソッドを含めることは理にかなっており、正常に機能します。プライベートクラスのメソッドも正常に機能しますが、上記の投稿に従います。

2
Hugo