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