【问题标题】:Rails ActiveSuppport:Concern and Private MethodsRails ActiveSupport:关注和私有方法
【发布时间】:2013-02-18 01:21:55
【问题描述】:

这是一个关于 Rails 关注点的好主意:http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

创建不属于公共 API 的非常小的方法也是一个好主意。如果不使用关注点,它们将成为 ruby​​ 类中的私有方法。

在 Rails ActiveSupport::Concern 模块中创建私有方法有意义吗?如果是这样,private 是否适用于关注定义中的常规实例方法和类方法?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 activesupport-concern


    【解决方案1】:

    在 Rails ActiveSupport::Concern 模块中创建私有方法有意义吗?

    考虑到关注点是最终将包含在其他类中的智能模块——是的,确实如此。它只是一个可移植的代码,可提取的行为,我想在编写它时将它视为我的控制器(或模型等)的一部分。所以基本上你只需像往常一样声明方法privateprotected

    也许the post you linked 自 2013 年以来已更新,但 DHH 在其中的一个示例中确实做到了这一点:

    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
    

    【讨论】:

    • 这不会使方法隐藏,您仍然需要为此使用“private”关键字。
    • 似乎从关注的方法调用时,self.class.method_name 不可访问,因为私有。
    【解决方案2】:

    这只是我的意见,但现在我对私有类方法摸不着头脑,它们有什么用?无论如何,如果你真的需要它们,请参考这篇文章:How to create a private class method?

    在关注模块中拥有私有实例方法确实很有意义,并且可以正常工作。私有类方法也可以正常工作,但要遵循上述帖子。

    【讨论】:

    • 这很简单:您需要将类方法分解成更小的块,并且不想在类接口中公开这些块。基本上与您在任何其他情况下使用私有方法的原因相同。
    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多