2010-01-12 3 views
1

J'ai un problème en utilisant acts_as_textiled et has_foreign_language plugins ensemble.Extension d'un attribut getter existant dans le modèle de rails

TextElement mon modèle dans mon application

class TextElement < ActiveRecord::Base 
    has_foreign_language :value 
    acts_as_textiled :value 

HasForeignLanguage

def has_foreign_language(*args) 
    args.each do |field| 
     # Define the Getter 
     define_method(field.to_s) do 
     . 
     . 
     . 

ActsAsTextiled

def acts_as_textiled(*attributes) 
. 
. 
. 
    attributes.each do |attribute| 
    define_method(attribute) do |*type| 
. 
. 
. 

Les deux plugins utilisent define_method et qui dans tous les cas j'appelle les mixins dans TextElement, le dernier substitue le getter défini précédemment.

Existe-t-il un moyen de sauvegarder le getter existant et de l'appeler dans le getter nouvellement défini? similaire à l'utilisation de super si elles ont été héritées.

J'ai fourchu ces plugins donc tout est juste jeu là.

Toute aide appréciée.

Répondre

1

Vous pouvez également réécrire ces deux en utilisant alias_method_chain.

def some_class_method_that_overrides(*columns) 
    columns.each do | c | 
    overriden_name = if instance_methods.include?(c) 
     alias_method_chain(c.to_sym, "extra") 
     "#{c}_with_extra" 
    else 
     c 
    end 
    define_method(overriden_name) do ... 
    end 
    end 
end 
+0

Savez-vous ce qui se passe ici? les docs pour alias_method_chain sont très déroutants. –

+0

S'il vous plaît google pour alias_method_chain, il y a beaucoup d'explications sur ce qu'il fait – Julik

0

Vous pourriez essayer d'avoir un des plugins pour décorer les attributs au lieu de les redéfinir. Quelque chose comme (j'étends objet ici mais vous pouvez étendre celui qui en a besoin):

class Object 
    def decorate!(attr) 
    method = self.method(attr) 
    define_method(attr) do |value| 
     result = method.call(value) 
     yield(result) 
    end 
    end 
end 

Alors avec décorer! en place, vous pouvez essayer cela dans acts_as_textilized

def acts_as_textiled(*attributes) 
. 
    attributes.each do |attribute| 
    self.decorate!(attribute) do |return_value_of_decorated_method| 
    # decorate code here 

Ou quelque chose dans ce sens. Non testé, vous devrez peut-être modifier, mais l'idée de base est là, je pense.

+0

Merci Dave je vais essayer demain et vous faire savoir si cela fait l'affaire. –

Questions connexes