Mam sytuację w mojej aplikacji Rails, w której muszę uwzględnić dowolne moduły w zależności od bieżącego stanu środowiska wykonawczego. Moduł zapewnia niestandardowy kod aplikacji, który jest potrzebny tylko wtedy, gdy spełnione są określone warunki. Zasadniczo, jestem ciągnięcie nazwę spółki z obecnej sytuacji i przy użyciu tego jako nazwy pliku dla modułu i jego definicja:Ruby: Dołącz nazwę modułu dynamicznego
p = self.user.company.subdomain + ".rb"
if File.exists?(Rails.root + "lib/" + p)
include self.class.const_get(self.user.company.subdomain.capitalize.to_sym)
self.custom_add_url
end
Mój moduł testowy wygląda następująco:
module Companyx
def custom_add_url
puts "Calling custom_add_url"
end
end
Teraz w konsoli to faktycznie działa dobrze. Mogę wyciągnąć użytkownika i obejmują moduł tak:
[1] pry(main)> c = Card.find_by_personal_url("username")
[2] pry(main)> include c.class.const_get(c.user.company.subdomain.capitalize)=> Object
[3] pry(main)> c.custom_add_url
Wywołanie custom_add_url
Jeśli próbuję uruchomić linię zawierać od mojego modelu, mam
NoMethodError: undefined method `include' for #<Card:0x007f91f9094fb0>
Może ktoś sugerują, dlaczego instrukcja include działałaby na konsoli, ale nie w moim kodzie modelu?
Zmiana kontekstu wydaje się komplikować: obiekt sam przestaje istnieć (lub dokładniej jego powiązanie z obiektem użytkownika)? Próbowałem różnych metod obejść to i przeczytać ten artykuł, aby zrozumieć, co się tutaj dzieje (http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-theself/) bezskutecznie. –
Och, moje złe. Zasadniczo, ja w nowym kontekście jest klasą. Jest podobny do robienia ewaluacji klasowej. Zrobiłem coś takiego jako eksperyment na osobistym projekcie. Góra tego pliku powinna pomóc: https://github.com/Hitonagashi/UndergroundFootball/blob/master/app/models/player.rb –
Nie jestem pewien czy rozumiem: myślę, że mówisz o inicjalizacji w kodzie, gdzie dynamicznie dodajesz wszystkie możliwe umiejętności jako metody klasowe? Nie widzę, jak to dotyczy mojego problemu, ponieważ nie mogę dodać obiektu powiązanego do klasy. Czy istnieje jakiś sposób uzyskania dostępu do relacji instancji do kodu wewnątrz bloku klasy? –