23

У меня есть приложение Rails 3 с несколькими двигателями, содержащими дополнительные функции. Каждый движок - это отдельная услуга, к которой клиенты могут приобрести доступ.Как я могу сделать маршруты из механизма Rails 3 доступным для хост-приложения?

У меня, однако, проблема с маршрутами из двигателей, которые не доступны для контроллеров и просмотров.

Контроллер:

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 в двигателе:

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

config/routes.rb в приложении:

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

lib/my_engine_name.rb в двигателе:

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

пытается перейти к /classrooms/new результатов в

NoMethodError in Classrooms#new 

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

и попытке вызова classrooms_path от других просмотра результатов в одной и той же ошибки. Я могу, однако, позвонить MyEngineName::Engine.routes.url_helpers.classrooms_path и заставить его работать. Я думаю, что я мог бы определить маршруты неправильно, но не могу найти другой способ, который работает.

Пробовал использовать приложение как с пассажирским (автономным, так и с Apache-модулем) и WEBrick (сервер рельсов). Использование последних Rails из Git (7c920631ec3b314cfaa3a60d265de40cba3e8135).

ответ

25

Изменение config.routes в двигателе на:

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

так, как вы его, маршруты доступны только в MyEngineName::Engine пространстве имен, а не в остальной части приложения хоста рельсы.

Там раньше был блог с большим количеством информации, но, к сожалению, больше не доступен:

+0

Doing что, снимая навесной вызов в моем приложении-маршрутах, и определении объема в машинных маршрутах ('scope '/ engine' do') и все работает. Большое спасибо :) – PerfectlyNormal

+0

Прохладный, спасибо за информацию о других шагах, необходимых для работы Маршрутов двигателя. – bowsersenior

+2

Для Rails 3.1 и более поздних версий удалите параметр «map» в блок (просто удалите всю часть '| map |'). –

26

У меня была такая же проблема, и нашел это в documentation:

Поскольку теперь вы можете смонтировать двигатель внутри маршрутов приложения, не имеют прямого доступа к двигателю url_helpers внутри приложения. Когда вы монтируете движок в маршрутах приложения, создается специальный помощник, который позволяет вам это делать.Рассмотрю такой сценарий:

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

Теперь вы можете использовать помощник my_engine внутри приложения:

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

для кода внутри двигателя, вам нужно заранее добавлять маршруты к своим контроллерам с именем двигателя? Или вы можете просто использовать 'classrooms_path' изнутри Engine? – Jwan622

+0

Jwan622, для собственных маршрутов вы можете использовать помощники без каких-либо префиксов. –