Bir geliştiricinin, sınıf tanımında (normal acts_as desenini izleyerek) basit bir bildirimle bir sınıfa çeşitli özellikler eklemesine olanak tanıyan bir eklenti yapıyorum. parametresi bir yöntem olarak var specific_method_to_use, ama yol kodu genellikle: Örneğin, eklenti tüketen kod ı için sağlanan değer olmadığını kontrol hata istiyorum, çünkü benim soru ortaya çıkıyorBir Ruby sınıf tanımının sonunda kodu çalıştırmak için kanca nasıl ayarlayabilirim?
class YourClass
consumes_my_plugin option1: :value1, specific_method_to_use: :your_method
end
gibi
görünebilir organize ve yüklü, yöntem henüz mevcut değil.
benim eklenti kod geçici şuna benzer:
module MyPlugin
extend ActiveSupport::Concern
module ClassMethods
def consumes_my_plugin(options = {})
raise ArgumentError.new("#{options[:specific_method_to_use]} is not defined") if options[:specific_method_to_use].present? && !self.respond_to?(options[:specific_method_to_use])
end
end
end
Bu çalışacak:
class YourClass
def your_method; true; end
consumes_my_plugin option1: :value1, specific_method_to_use: :your_method
end
Ama bu insanların çoğu kod yazmak nasıl olduğunu ve olmaz:
class YourClass
consumes_my_plugin option1: :value1, specific_method_to_use: :your_method
def your_method; true; end
end
YourClass yükleme süresinde nasıl başarısız olabilirim? Hata yapmak istiyorum, NoMethodError ile çalışma zamanında değil. Tüm sınıf yüklenene kadar ArgumentError'u yükselten satırın yürütülmesini erteleyebilir miyim, yoksa bunu başarmak için başka bir şey yapamaz mıyım?
Eğer 'specific_method_to_use' çağrılan olurdu noktada çeki yapabilir sınıf yükleme zamanında kontrol yapmak yerine? –
: specific_method_to_use yalnızca çalışma zamanında çağrılır, bu yüzden NoMethodError'ı yakalayabilir ve etrafındaki geliştiriciye yapıcı mesajlar verebilsem de, hata sadece yükleme zamanında değil, çalışma zamanında yakalanırdı ... ikincisi tercih edilebilir. – LikeMaBell
'self.respond_to?' Kullanarak yaptığınız kontrol, "YourClass # your_method" örnek yöntemini kontrol etmeyecektir; Tek sınıf/sınıf yöntemi 'YourClass.your_method' için arayacaktır. Cevabımda, onu "self.instance_methods.include" olarak değiştirdim. 'Response_to'ya geri dönmekten çekinmeyin?Eğer niyetini yanlış anladım. –