UPDA TE: Dodałem blogu na podstawie tej odpowiedzi, ale o wiele bardziej szczegółowo: http://thoughtsincomputation.com/posts/coding-an-acts_as-gem-for-rails-3
-
nie jestem świadomy innego źródła samouczka off szczycie mojej głowy, ale tutaj są kilka ogólnych wskazówek.
Szyny 3 używają naprawdę użytecznej funkcji o nazwie Railtie - patrz http://api.rubyonrails.org/classes/Rails/Railtie.html.
Tak więc, gdybym wykonywał klejnoty acts_as_ *, zacząłem tam. Moja railtie może wyglądać mniej więcej tak:
# lib/acts_as_awesome/railtie.rb
require 'rails'
require 'acts_as_awesome'
module ActsAsAwesome
class Railtie < Rails::Railtie
config.to_prepare do
ApplicationController.send(:extend, ActsAsAwesome::Hook)
end
end
end
oraz kod ActsAsAwesome :: Hook:
# lib/acts_as_awesome/hook.rb
module ActsAsAwesome::Hook
def acts_as_awesome(*args)
options = args.extract_options!
# do the things that make the controller awesome.
include ActsAsAwesome::InstanceMethods
before_filter :an_awesome_filter
end
end
czuję pojęcia tutaj są zdrowe i są stosowane podobne procesy przed. Zasadniczo poleciłoby to Railsom wykonanie bloku to_prepare raz podczas produkcji i przed każdym zadaniem w fazie rozwoju (chcemy, ponieważ ApplicationController zostanie przeładowany w tym czasie, potencjalnie usuwając naszą metodę przechwytującą); a haczyk jest właśnie taki: dodaje hak do wszystkich kontrolerów (lub raczej wszystkich kontrolerów rozszerzających ApplicationController), aby umożliwić użytkownikowi wprowadzenie prawdziwego "Awesome" kodu do swoich kontrolerów bez wpływu na kontrolery, które tego nie potrzebują.
Haczyk #acts_as_awesome sam w sobie nie przekazuje niesamowitej funkcjonalności. To dlatego, że nie wszystkie kontrolery mogą potrzebować tej funkcji. Zamiast tego metoda ta jest odpowiedzialna za wprowadzenie prawdziwych rzeczy za pomocą modułu ActsAsAwesome :: InstanceMethods. W ten sposób użytkownik otrzymuje tylko niesamowitą funkcjonalność, jeśli jawnie wywoła metodę acts_as_awesome. Dodaje także filtr przed do kontrolera, aby wykazać, że kod w tej metodzie byłby dokładnie taki sam, jak gdyby był w samej klasie kontrolera docelowego.
Ta technika powinna działać dokładnie tak samo, gdy kierujesz się do modeli zamiast kontrolerów: po prostu wprowadź hak w ActiveRecord :: Base. Ponieważ AR: B jest ładowany tylko podczas uruchamiania Railsów, prawdopodobnie powinieneś móc umieścić go w inicjalizatorze (patrz dokumentacja Railtie), ale zastrzegam sobie prawo do bycia tu pomylonym.
Osadnik dotyczący sztachety: dokumentacja brzmi tak, jakby należało ją wykryć automatycznie, ale często mam z tym problemy.Aby ominąć to po prostu wymagajcie sztachety z głównego pliku źródłowego twojego klejnotu (w powyższym przykładzie byłaby to lib/acts_as_awesome.rb).
Można zobaczyć całą źródło ActsAsAwesome w całej okazałości na moim rachunku github: http://github.com/sinisterchipmunk/acts_as_awesome
Mam nadzieję, że jest to pomocne. Twoje pytanie było nieco na wysokim poziomie, więc odpowiedź na wysokim poziomie jest najlepsza, co mogę zrobić.
-Colin MacKenzie IV
http://thoughtsincomputation.com
@sinisterchipmnk
dzięki tak dużo. Śledziłem twoje tutoriale. to jest pomocne. – cbrulak
Nie ma problemu, chętnie pomożemy. Dziękuję za przeczytanie (i wzmiankę!) Mojej zawartości :) Nigdy nie widziałbym tego pytania, gdyby nie link. (Widziałem, że pojawiły się w statystyce witryny, heh.) – sinisterchipmunk
Stworzyłem klejnot na podstawie tego artykułu i starej wtyczki Rails. Jeśli chcesz, możesz na to spojrzeć, ponieważ jest to dobry przykład: https://github.com/toptierlabs/acts_as_fulltextable – Tony