Hallo Michael,

vielen herzlichen Dank erstmal für Deine Mühe. Ich habe noch nicht ganz verstanden, wo das Problem ist. Aber ich werde mir das nochals auf Deine Anmerkungen hin anschauen.

Viele Grüße

Michael Kastner

Michael Schuerig schrieb:
On Sunday 03 June 2007, Michael Kastner wrote:

Mein Modul sieht (etwas verkürzt) so aus:

# acts_as_asset.rb in vendor/plugins/acts_as_asstet/lib
module Galt
   module Acts
     module Asset

       def self.included(mod)
         mod.extend(ClassMethods)
       end

       module ClassMethods
         def acts_as_asset(options = { :asset_dir => 'assets' })
           class_eval <<-EOV
             ASSET_DIR = '#{options[:asset_dir]}'
           EOV
           include Galt::Acts::Asset::InstanceMethods
         end
       end

       module InstanceMethods
         def raw_file_path
           File.join ASSET_DIR,
                     "#{self.name}".to_valid_file_name <<
".#{self.extension}" end
     end
   end
end

ActiveRecord::Base.class_eval do
   include Galt::Acts::Asset
end
# ende von acts_as_asset.rb


Das ist ziemlich straight forward.

A B E R, ich erhalte zur Laufzeit, wenn die Methode raw_file_path
aufgerufen wird, diese Fehlermeldung:

uninitialized constant Galt::Acts::Asset::InstanceMethods::ASSET_DIR

Warum wird ASSET_DIR als Konstante im Modul
Galt::Acts::Asset::InstanceMethods gesucht und nicht in der Klasse
Asset?

In deinem Beispiel gibt es keine Klasse Asset, ich nehme aber an, dass du sie von AR abgeleitet hast.

Ich habe in Programming Ruby auf die Schnelle keine definitive Antwort gefunden, aber ich denke, Referenzen auf Konstanten werden mit statischem Scope aufgelöst werden. In diesem Fall ist das die Methode Galt::Acts::Asset::InstanceMethods#raw_file_path und entsprechend das Modul Galt::Acts::Asset::InstanceMethods.

Kann mir jemand auf die Sprünge helfen?

Dein Ansatz, eine Konstante in der AR-Unterklasse zu definieren und darauf aus einer Method zuzugreifen ist nicht gut. Besser ist das mit einem "inheritable attribute/hash":

       module ClassMethods
         def acts_as_asset(options = { :asset_dir => 'assets' })
           write_inheritable_hash :acts_as_asset_options, options
           class_inheritable_reader :acts_as_asset_options
           include Galt::Acts::Asset::InstanceMethods
         end
       end

       module InstanceMethods
         def raw_file_path
           File.join acts_as_asset_options[:asset_dir],
             "#{self.name}".to_valid_file_name << ".#{self.extension}"
         end
       end

Oder so ähnlich...

Michael



------------------------------------------------------------------------

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

--

------------------------------
galt.de Web :-) Services
Michael Kastner
Berliner Straße 3
D-65439 Flörsheim

Telefon +49 (0) 6145 / 938 581
Telefax +49 (0) 6145 / 938 582
E-Mail [EMAIL PROTECTED]
Homepage http://www.galt.de
------------------------------
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an