Rails ActiveSuppport: проблемы и частные методы

Это отличная идея для беспокойства в рельсах: http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

И также неплохо создавать очень маленькие методы, которые не являются частью общедоступного API. Без использования проблем они становятся частными методами в классе ruby.

Имеет ли смысл создавать частные методы внутри модуля Rails ActiveSupport :: Concern? Если да, то работает ли частная работа как для обычных методов экземпляра, так и для методов класса в определении проблемы?


person justingordon    schedule 18.02.2013    source источник


Ответы (2)


Имеет ли смысл создавать частные методы внутри модуля Rails ActiveSupport::Concern?

Учитывая, что проблема связана с интеллектуальными модулями, которые в конечном итоге будут включены в другие классы - да, это так. Это просто переносимый код, извлекаемое поведение, и я хотел бы рассматривать его как часть моего контроллера (или модели и т. Д.), Когда я его пишу. Таким образом, вы просто объявляете методы private или protected, как обычно.

Возможно, сообщение, на которое вы ссылаетесь, обновлялось с 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
person jibiel    schedule 17.11.2015
comment
Это не сделает метод скрытым, вам все равно нужно использовать для этого ключевое слово private. - person Artur Beljajev; 08.03.2016
comment
Похоже, что при вызове из вызывающего беспокойства метода self.class.method_name недоступен, поскольку является закрытым. - person ybart; 07.08.2017

Это просто мое мнение, но сейчас я ломаю голову о методах частного класса, для чего они нужны? В любом случае, если они вам действительно нужны, обратитесь к этому сообщению: Как создать метод частного класса?

Имеет смысл иметь методы частного экземпляра в модуле беспокойства и будет работать нормально. Методы частного класса также будут работать нормально, но после указанного выше сообщения.

person Hugo    schedule 18.02.2013
comment
это просто: вам нужно разбить свой метод класса на более мелкие фрагменты, и вы не хотите показывать эти фрагменты в интерфейсе класса. По сути, по той же причине, по которой вы бы использовали частные методы в любом другом случае. - person Grzegorz; 27.03.2017