Użycie rails engine dla prostego systemu odznaczeń

Witam, potrzebuje stworzyć do aplikacji system odznaczeń (badges), pewnie widzieliście coś takiego w niejednej aplikacji webowej.
Z grubsza miało by to model Badges oraz relacje user_has_many_badges czyli tabela łącząca, jakis swój kontroller dla czesci uzytkownika oraz dla admina który tworzyłby nowe odznaczenia ze swoim kontrolerem.
Chciałbym użyć do tego Engines bo będzie potem potrzeba szybkiego podpięcia tego w innych aplikacjach, ale nigdy sie w to nie bawiłem.

  • stworzyłem nowy plugin, z opcją --mountable, udało mi sie go podpiąć do głównej apki -> mount Badges::Engine, at: ‘/’, as: ‘badges’.
  • dodałem w Badges::BadgesController linie: layout ‘application’
  • wywaliłem katalog /badges/view/layout, ponieważ ma to używać swoich widoków ale wyświetlonych wewnątrz głównego layoutu aplikacji.

Niestety problem jest taki że nie rozpoznaje mi ścieżek root_path w tym layoucie. Zmiana

[code=ruby]class BadgesController < ApplicationController

na

class BadgesController < ::ApplicationController[/code]
dała tyle że mam dostęp do ogólnych helperów, jak current_user itp, ale nie do ścieżek.

Nie do końca rozumiem czym różni się użycie --mountable i --full, może tutaj jest problem ?

Można spróbować gemu gioco https://github.com/joaomdmoura/gioco

Dzięki ale mam polecone stworzyć to od podstaw żeby można było dowolnie dostosować a i mi się przyda to jako nauka engines.

Używaj main_app.root_url, main_app.sign_in_path itd. Kiedyś czytałem wyjaśnienie tego, ale nie pamiętam gdzie i o co dokładnie chodziło.

Wiem że moge tego użyć ale czy w takim razie wszystkie ścieżki w layouts/application.html.erb mam przepisać pod to ? Niezbyt elastyczne rozwiązanie.

Jeśli nie chcesz osobnego namespace’u dla aplikacji i engine’u (bo jest to głupie dla engine’u który ma być mocno zintegrowany z aplikacją), to po prostu nie dawaj engine’owi osobnego namespace’u. Wywal moduł Badges i powyciągaj z niego klasy do globalnej przestrzeni nazw.

Wtedy też zupełnie Ci odpada dyrektywa “mount” w routes.rb aplikacji, kod engine’u zostaje potraktowany jako “podstawa” kodu aplikacji a nie osobna mountable app.

Czyli nie używać --mountable przy generowaniu pluginu ?

Nie mam pojęcia, napisałem kilka mountable appsów ale ani razu nie używałem tego generatora :wink:

aha :slight_smile: a miałeś problem z taki jak opisałem powyżej ze ścieżkami w głównym layoucie aplikacji gdy wyświetlasz go z kontekstu kontrolera z engine ?

…co też przekłada się na routesy i ich helpery oczywiście.

dzięki, wypróbuje

Udało się uruchomić dzięki Waszym radom :slight_smile: Utknąłem teraz na etapie testów, chciałbym używać rspeca i capybary, pokonfigurowałem engine tak jak tutaj opisane

niestety dostaje błąd: cannot load such file – /Users/artur/Work/glowna_apka/badges/spec/dummy/Rakefile

Czy konieczne jest użycie apki z folderu test/dummy ? Co sądzicie o użyciu tego gema https://github.com/pat/combustion

To z Rakefile’em to jakaś podstawa, zobacz jak środowisko testowe chociażby Spree (też tam się tworzy dummy app).

Ale fajne, nie znałem! :slight_smile:

możesz napisać coś więcej o tworzeniu tego środowiska testowego dla engine ? chodzi mi o testowanie z pomocą rspec i factory a nie wiem jak to ugryźć, gdzie wrzucić testy, czy musze skopiowac factories do katalogu engine’a itp… ? Na razie utknąłem na czymś takim, po załadowaniu factories z głownej aplikacji.

[quote]Failure/Error: @administrator = create :administrator
NameError:
uninitialized constant User[/quote]
Factory administrator dziedziczy po modelu User.

Wszystko do enginu, od app/ przez db/ po test/ czy spec/.
Dummy app ma być szkieletową appką railsową, służącą wyłącznie podpięciu enginu (…odpaleniu migracji i potem testów).

dzięki, to sporo rozjaśnia

a co do wspomnianego gema https://github.com/pat/combustion czy tutaj także zmiany wprowadzam tylko w katalogu engine ? bo dokumentacja czasem nie precyzuje

Miałbym dodatkowe pytanie, dotyczące bardziej projektowania aplikacji. Chciałbym żeby mój engine wykrywał zmiany w modelu/modelach lub wywołanie akcji danego kontrolera bez ingerencji w ich kod w aplikacji gdzie engine jest załączony. Przykładowo użytkownik ustawia sobie avatar, chciałbym za to przyznać odznaczenie a z drugiej strony bardziej skomplikowany przykład użytkownik stworzył 5ty projekt i za to ma inne odznaczenie. Wiem że można to sprawdzać w tle np rake taskiem i whenever ale problem w tym że chciałbym aby niektóre odznaczenia były przyznawane natychmiastowo po wykonanej akcji a inne sprawdzane w tle np raz dziennie.

Na razie znalazłem taki gem https://github.com/krisleech/wisper może ktoś ma coś ciekawszego.

Wzorzec mediator. Może być wisper, lub cokolwiek innego, zasada wszędzie taka sama.
Bez ręcznego publikowania zostaje tylko hakowanie i wpinanie się w metody AR, nie polecam.

tu podobny gem, ale do modeli https://github.com/TiagoCardoso1983/association_observers