Jak nadpisać szablon generatora rails w klejnocie?

Jeśli chcesz nadpisać szablon generatora (bez wymiany samego generatora), w Rails 3 możesz po prostu upuścić pliki w odpowiednio nazwanych miejscach w lib / templates, a Rails je znajdzie.

A jeśli chcesz zrobić to z klejnotem? Staram się wykorzystać standardowy format rusztowania mojego zespołu i go gemifikować, abyśmy mogli udostępniać go we wszystkich projektach i łatwo go aktualizować, zamiast kopiować pliki do lib / w każdym projekcie. To działa dobrze w przypadkach, w których stworzyłem nowy generator; podłączam się do niego za pomocą config.generatory w zastosowaniu.RB i Rails Go znajdują. Ale kiedy wrzucam pliki szablonów do lib / templates w gem , Rails znajduje swoje własne domyślne szablony i renderuje je zamiast moich. Myślę, że kolejność wyszukiwania to RAILS_ROOT / lib / templates, RAILS_GEMS/lib/templates, OTHER_GEMS/lib / templates.

Jakie jest rozwiązanie? Nie znajduję w tym zbyt wiele docco, a code-diving through Rails nie przedstawia oczywistego rozwiązania. Dzięki!

Author: IdahoEv, 2011-04-14

6 answers

Update: IdahoEv ma prawidłową odpowiedź, ale ten kod, począwszy od wersji 3.1, generuje następujące ostrzeżenie o depilacji:

DEPRECATION WARNING: config.generators in Rails::Railtie is deprecated. Please use config.app_generators instead.

Więc użyj tego zamiast:

module MyGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path('../templates', __FILE__)
    end 
  end
end 
 11
Author: pixelearth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-02 16:34:58

Rozgryzliśmy to. konfiguracja generatorów ma zmienną "templates", która wyświetla ścieżki wyszukiwania dla szablonów. Problem polega na tym, że przeszukuje tę tablicę w kolejności, aż znajdzie dopasowanie, więc szablony w Twojej aplikacji lub w Rails zostaną znalezione przed szablonami w Twoim klejnocie.

Rozwiązaniem jest umieszczenie ścieżki szablonów na początku tablicy ścieżek szablonów. Wygląda tak. Ten plik znajduje się w [GEM] / lib / my_gem.rb. Szablony są równoległe do niego w [GEM] / lib / templates/.

module MyGem
  class Railtie < Rails::Railtie
    config.generators do |g|
      g.templates.unshift File::expand_path('../templates', __FILE__)
    end 
  end
end 

Jeśli szablony mają ścieżkę wewnątrz [GEM] / lib / templates, która odpowiada ścieżce domyślnego szablonu, który nadpisujesz, powinno to działać. Na przykład, jeśli to zrobiłeś i utworzyłeś [GEM] / lib/templates/active_record/model / model.RB, nadpisze domyślny szablon modelu AR.

Nie jest wymagane sprawdzanie generatorów przez małpę.

EDIT: zauważ, że ponieważ ta odpowiedź została pierwotnie zamieszczona, "config.Generatory " zostały usunięte z szyn. Użyj zamiast tego config.app_generators zgodnie z odpowiedzią pixelearth poniżej.

 11
Author: IdahoEv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 12:41:20

Mam ten sam problem używając rails 4.1.5. A tutaj jest zmontowane rozwiązanie puzzle.

Po pierwsze stwórz Railtie w swoim klejnocie w ten sposób. Pamiętaj o konfiguracji.generatory są przestarzałe i odpowiedź thalespf.

module SomeGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path('../../templates', __FILE__)
    end
  end
end
Działa jak czar!

UPD. Próbowałem stworzyć gem tylko z szablonów i używać go w Rails:: Engine. Ale wymaga tego:

# lib/your_engine/engine.rb
require 'your_gem_with_generator_templates' # Loads Railtie
 3
Author: 18augst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:27

Co do rails 4 i Rails engine jestem w stanie zrobić to tak:

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    config.generators do |g|
      g.templates.unshift File::expand_path("../templates", File.dirname(__FILE__))
    end
  end
end
 1
Author: Roman Trofimov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 12:42:42

Only The path"../../ templates " w g. templates.unshift File:: expand_path ('../../ templates', _ FILE _) zadziałało dla mnie. Im in rails 3.2

 1
Author: thalespf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-20 05:42:46

Jeśli ktoś się z tym boryka, to po prostu mam bardzo podstawowy klejnot pracujący z innymi odpowiedziami tutaj, które można zobaczyć na przykład: szablony

 0
Author: GMA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 12:26:19