ruby-on-rails - rails ActiveSupport :Concern and Private Methods

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

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

制作不属于公共(public) API 的非常小的方法也是一个好主意。如果不使用关注点,这些将成为 ruby​​ 类中的私有(private)方法。

在 Rails ActiveSupport::Concern 模块中创建私有(private)方法是否有意义?如果是这样,private 是否对关注点定义中的常规实例方法和类方法都有效?

最佳答案

Does it makes sense to create private methods inside of a Rails ActiveSupport::Concern module?

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

关于ruby-on-rails - rails ActiveSupport :Concern and Private Methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928176/

相关文章:

ruby-on-rails - activerecord-import gem NoMethodError : undefined method 'import'

ruby - [1,2,3].to_enum 和 [1,2,3].enum_for 在 Ruby 中的区别

ruby-on-rails - Rails 3.2.6 和 authlogic 3.1.3 的 session Nil

ios - 如何通过 CocoaPods 安装后 Hook 修改 OTHER_LDFLAGS?

ruby - Kaminari 和 Capybara 冲突

ruby-on-rails - Rails : Why is my . 每个循环都被跳过了吗?

javascript - Rails 在生产页面加载中复制 Assets ?

ruby-on-rails - 如何在 Windows Azure 上部署 Ruby on Rails 应用程序?

ruby-on-rails - Controller helper_method

ruby-on-rails-3 - rspec 忽略skip_before_filter?