Deface nie działa z poziomu engine

Hej!
Nie wiem czy ktokolwiek próbował używać deface do jakichś projektów poza spree ale ja własnie się na to porwałem i niestety mam poważny problem - deface nie chce działać z poziomu engine’u. Przygotowałem przykładową aplikację aby zademonstrować o co chodzi:

Wystarczy sklonować i przejść pod localhost:3000/

Ma ktoś może pomysł co może być problemem? Gem wydaje się świetny gdyby nie ten mały szkopuł (a używanie tego nie z poziomu engine’ów tylko z poziomu /app/overrides trochę nie ma sensu :wink: )

Dzięki!

Przyznam się, że nie miałem do tej pory styczności ani z gemem deface ani też z enginami w railsach. Pogrzebałem sobie chwilę wczoraj przy tym i oto kilka uwag:

  1. w app masz katalog overrides, natomiast w katalogu engina już overwrites
  2. twój engine ładuje 1 plik który posiada tylko deklarację modułu DefaceTestEngine ( https://github.com/mbajur/deface_test/blob/master/deface_test_engine/lib/deface_test_engine.rb ), natomiast świeżo wygenerowany engine zawiera dodatkowo deklarację klasy dziedziczącej po Rails::Engine
  3. to wyżej jest o tyle istotne, że gem deface szuka tych nadpisań w “railties” pobranych z Rails.application.railties._all (i tu już brakuje Twojego engina): https://github.com/spree/deface/blob/master/lib/deface/environment.rb#L54

Niestety poprawienie powyższych rzeczy ciągle nie sprawia, że działa zgodnie z Twoimi oczekiwaniami, trzeba debugować dalej (https://github.com/spree/deface/blob/master/lib/deface/environment.rb#L82). Powodzenia.

Metodą prób i błędów doszedłem do tego (zakładając że poprawiliśmy wcześniej wskazane niedociągnięcia), że po zmianie pliku replace_result.* na replace_result2.* działa jak należy.

1 Like

Super, wielkie dzięki !! Mógł byś tylko rozwinąć te pkt. ?

Cały kod tej aplikacji jest praktycznie bez moich modyfikacji. Wygenerowanie aplikacji przez rails new, wygenerowanie engine’a przez rails plugin new ... i dodanie deface + tych plików .deface, nic tam nie ruszałem. Nie mam też żadnego doświadczenia z engine’ami dlatego mógł byś wyjaśnić co konkretnie zrobiłeś (jak poprawiłeś te dwa pkt) ? :wink:

Gdy odpaliłem rails plugin new foo --mountable to railsy utworzyły mi m.in. plik foo/lib/foo/engine.rb, a w nim klasę:

module Foo
  class Engine < ::Rails::Engine
    isolate_namespace Foo
  end
end

Ten plik z kolei jest ładowany w foo/lib/foo.rb:

require "foo/engine"

module Foo
end

U Ciebie brakuje obu tych rzeczy.

1 Like

Aha, okej. No to już wiem co było powodem całego zamieszania - nie użyłem flagi --mountable. Jesteś wielki, dzięki za pomoc :slight_smile: