Где эти методы "без" в гемах Rails определены? - PullRequest
0 голосов
/ 01 мая 2011

Я видел несколько мест, где в драгоценных камнях упоминаются *_without_* методы, и я не вижу, где они определяются. Вот два примера из камней validationgroup и delayed_jobs.

  1. В validation_group.rb определен метод add_with_validation_group, который ссылается на add_without_validation_group в последней строке; однако add_without_validation_group нигде не определен.

    def add_with_validation_group(attribute,
                                  msg = @@default_error_messages[:invalid], *args,
                                  &block)
      add_error = true
      if @base.validation_group_enabled?
        current_group = @base.current_validation_group
        found = ValidationGroup::Util.current_and_ancestors(@base.class).
          find do |klass|
            klasses = klass.validation_group_classes
            klasses[klass] && klasses[klass][current_group] &&
            klasses[klass][current_group].include?(attribute)
          end
        add_error = false unless found
      end
      add_without_validation_group(attribute, msg, *args,&block) if add_error
    end
    
  2. В message_sending.rb для DelayedJob динамически передаваемые параметры метода называются #{method}_without_send_later. Тем не менее, я вижу только, где #{method}_with_send_later определяется где-либо в этом драгоценном камне.

    def handle_asynchronously(method)
      without_name = "#{method}_without_send_later"
      define_method("#{method}_with_send_later") do |*args|
        send_later(without_name, *args)
      end
      alias_method_chain method, :send_later
    end
    

Так что я верю, что есть какая-то магия Rails, которую я пропускаю с этими "без" методами. Тем не менее, я не могу понять, что искать в Google, чтобы ответить на вопрос самостоятельно.

1 Ответ

4 голосов
/ 01 мая 2011

это то, что alias_method_chain предоставляет вам.

В основном, когда вы говорите

alias_method_chain :some_method, :feature

Вам предоставляется два метода:

some_method_with_feature
some_method_without_feature

Что происходит, когда вызывается оригинал some_method, на самом деле он вызывает some_method_with_feature. Затем вы получаете ссылку на some_method_without_feature, которая является вашим исходным объявлением метода (то есть для поведения возврата / по умолчанию). Итак, вы захотите определить some_method_with_feature, чтобы фактически делать что-то, что, как я говорю, вызывается, когда вы звоните some_method

Пример:

def do_something
  "Do Something!!"
end

def do_something_with_upcase
  do_something_without_upcase.upcase
end

alias_method_chain :do_something, :upcase

do_something # => "DO SOMETHING!!"

См. Документацию здесь :

...