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

-- 
Michael Schuerig
mailto:[EMAIL PROTECTED]
http://www.schuerig.de/michael/
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an