2010-10-25 6 views
7

Próbuję wydobyć jakiś wspólny kod w klejnot.rails3 gem: acts_as_something

Myślę, że acts_as_something to dobra strategia na proste ponowne użycie.

Czy istnieje dobry samouczek, który omawia to dla rails3 gems? Znalazłem kilka, które omawiać rails2 (takich jak http://guides.rubyonrails.org/plugins.html), ale to jest specyficzne dla rails2

oto kilka samouczków/blogi Ja już czytać:

dzięki

Odpowiedz

12

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

+0

dzięki tak dużo. Śledziłem twoje tutoriale. to jest pomocne. – cbrulak

+0

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

+0

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