23

Mam aplikację Rails 3 z kilkoma silnikami zawierającymi dodatkowe funkcje. Każdy silnik jest osobną usługą, do której klienci mogą nabyć dostęp.Jak udostępnić trasy z silnika Rails 3 do aplikacji hosta?

Mam jednak problem z trasami z silników, które nie są łatwo dostępne dla kontrolerów i widoków.

kontroler:

class ClassroomsController < ApplicationController 
    .. 
    respond_to :html 

    def index 
    respond_with(@classrooms = @company.classrooms.all) 
    end 

    def new 
    respond_with(@classroom = @company.classrooms.build) 
    end 

    .. 
end 

app/views/classrooms/new.html.haml:

= form_for @classroom do |f| 
    .. 
    f.submit 

config/routes.rb w silniku:

MyEngineName::Engine.routes.draw do 
    resources :classrooms 
end 

config/routes.rb w aplikacji:

Seabed::Application.routes.draw do 
    mount MyEngineName::Engine => '/engine' 
    ... 
end 

lib/my_engine_name.rb w silniku:

module MyEngineName 
    class Engine < ::Rails::Engine 
    end 
end 

próbuje przejść do /classrooms/new wyników w

NoMethodError in Classrooms#new 

Showing app/views/classrooms/_form.html.haml where line #1 raised: 
    undefined method `hash_for_classrooms_path' for #<Module:0x00000104cff0f8> 

i próbuje wywołać classrooms_path od innych wyników widok w tym samym błędem. Mogę jednak zadzwonić pod numer MyEngineName::Engine.routes.url_helpers.classrooms_path i uruchomić go. Myślę, że mogłem źle zdefiniować trasy, ale nie mogę znaleźć innego sposobu, który działa.

Próbowałem uruchomić aplikację zarówno z Pasażerem (samodzielny i moduł Apache), jak iz WEBrick (serwer rails). Używanie najnowszych Railsów z Git (7c920631ec3b314cfaa3a60d265de40cba3e8135).

Odpowiedz

25

Zmień config.routes w silniku do:

Rails.application.routes.draw do # NOT MyEngineName::Engine.routes.draw 
    resources :classrooms 
end 

sposób go mieć, trasy są dostępne tylko w przestrzeni nazw MyEngineName::Engine a nie w pozostałej części aplikacji Rails gospodarza.

Tam kiedyś blogu o więcej informacji, ale niestety nie jest już dostępny:

+0

to robić, usuwając mocowanie połączenia w moim app-tras i scopingu w maszynowni tras ('scope '/ engine' do') i wszystko działa. Wielkie dzięki :) – PerfectlyNormal

+0

Fajnie, dziękuję za informacje o innych krokach, które trzeba wykonać, aby uruchomić pracę silnika. – bowsersenior

+2

Dla Rails 3.1 i nowszych, usuń parametr 'map' do bloku (po prostu usuń całą część' | map | '). –

26

miałem ten sam problem i znalazł to w documentation:

Ponieważ można teraz zamontować silnik wewnątrz dróg aplikacji, nie mają bezpośredniego dostępu do silnika url_helpers w aplikacji. Po zamontowaniu silnika na trasach aplikacji tworzony jest specjalny helper, który pozwala to zrobić.Rozważmy taki scenariusz:

# config/routes.rb 
MyApplication::Application.routes.draw do 
    mount MyEngine::Engine => "/my_engine", :as => "my_engine" 
    get "/foo" => "foo#index" 
end 

Teraz można użyć pomocnika my_engine wewnątrz aplikacji:

class FooController < ApplicationController 
    def index 
    my_engine.root_url #=> /my_engine/ 
    end 
end 
+0

dla kodu w silniku, czy musisz wstawiać trasy do własnych kontrolerów również z nazwą silnika? Czy możesz po prostu użyć 'classrooms_path' z wnętrza silnika? – Jwan622

+0

Jwan622, dla własnych tras możesz używać helperów bez żadnych prefiksów. –