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