Hi Micha

In Ruby schreibst du z.B.:

alias_method :foo_without_feature, :foo
alias_method :foo, :foo_with_feature

Dann wird die Methode foo in foo_without_feature kopiert und danach wird 
foo_with_feature in foo kopiert.

Wenn du jetzt foo aufrufst, wird nicht mehr die Originalmethode foo, sondern 
foo_with_feature aufgerufen.
Um an die Originalmethode foo zu gelanden, rufst du foo_without_feature auf.

alias_method_chain ist ein Rails-spezifische Methode, die beide Aufrufe oben zu 
einem kürzt:

alias_method_chain :foo, :feature

Auf diese Weise kannst du mit dem Aufruf foo eine Kette von Methoden aufrufen, 
z.B.

a.foo: foo_with_feature1 => foo_with_feature2 => foo_with_feature3 => 
foo_without_feature (ehem foo)

Du musst dazu nicht die Stellen im Code ändern, an denen foo aufgerufen wird 
und kannst trotzdem neues Verhalten einführen.
Aber Vorsicht, it's magic! :)

In deinem Beispiel wird es genutzt, um die Parameter und Optionen von 
error_messages_for zu verändern.
Wenn jemand error_messages_for aufruft, wird erst 
error_messages_for_with_message_overrides aufgerufen.

Siehe auch http://api.rubyonrails.org/.
Methode ist u.a. dort beschrieben.

Hoffe, es hilft.

Grüße,
Thomas




Am 25.02.2010 um 19:24 schrieb Micha:

> Hallo Rubyisten,
> 
> ich arbeite mich seit längerem langsam und beständig in die Eingeweiden der 
> Ruby Scriptsprache und dem ROR Framework vor. Nun hänge ich gerade bei 
> alias_method_chain Methode. Dummerweise kann ich die Logik dahinter 
> irgendwie nicht nachvollziehen. 
> 
> Beispiel:
> 
> module ActionView
>  module Helpers
>    module ActiveRecordHelper
> 
>      def error_messages_for_with_message_overrides(*params)
>        options = params.extract_options!.symbolize_keys
>        options[:header_message] = nil unless options.include?
> (:header_message)
>        options[:class]? options[:class] += ' error' : options[:class] = 
> 'error'
>        options[:message] = nil unless options.include?(:message)
>        error_messages_for_without_message_overrides(params, options)
>      end
> 
>      alias_method_chain :error_messages_for, :message_overrides
>    end
>  end
> end
> 
> Was passiert hier? Es wird die Methode error_messages_for unter dem Kontext 
> einer anderen Methode message_overrides bzw. in Verbindung beider 
> überschrieben?
> 
> Es ist wahrscheinlich ganz einfach - kann mir jemand eine kleine 
> Einstiegshilfe geben?
> 
> Vielen Dank!
> Micha
> 
> _______________________________________________
> rubyonrails-ug mailing list
> [email protected]
> http://mailman.headflash.com/listinfo/rubyonrails-ug
> 

---
Thomas Baustert - Freiberuflicher Softwareentwickler
Averhoffstraße 10, 22085 Hamburg
+49(0)173-2391143 - [email protected]
USt-IdNr.: DE814405137










_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/listinfo/rubyonrails-ug

Antwort per Email an