23

Tengo una aplicación Rails 3 con varios motores que contienen funcionalidad adicional. Cada motor es un servicio separado al que los clientes pueden acceder.¿Cómo puedo hacer que las rutas de un motor Rails 3 estén disponibles para la aplicación host?

Estoy, sin embargo, teniendo un problema con las rutas de los motores que no están disponibles para los controladores y las vistas.

controlador:

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 en el motor:

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

config/routes.rb en aplicación:

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

lib/my_engine_name.rb en el motor:

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

intentar ir a /classrooms/new resultados en

NoMethodError in Classrooms#new 

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

e intentar llamar classrooms_path de cualquier otro ver los resultados en el mismo error. Puedo, sin embargo, llamar al MyEngineName::Engine.routes.url_helpers.classrooms_path y ponerlo en funcionamiento. Estoy pensando que podría haber definido las rutas incorrectas, pero no puedo encontrar otra manera que funcione.

He intentado ejecutar la aplicación tanto con Passenger (módulo autónomo y Apache) como con WEBrick (servidor de carriles). Usando los últimos Rails de Git (7c920631ec3b314cfaa3a60d265de40cba3e8135).

Respuesta

25

Cambio config.routes en su motor a:

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

La forma en que lo tienes, son las rutas sólo está disponible en el espacio de nombres MyEngineName::Engine y no en el resto de la aplicación rieles de acogida.

No solía ser un post con más información, pero por desgracia, ya no está disponible:

+0

Haciendo eso, la eliminación de la montura de guardia en mis app-rutas, y la determinación del alcance de las cámaras de máquinas rutas ('scope '/ engine' do') y todo funciona. Muchas gracias :) – PerfectlyNormal

+0

Genial, gracias por la información sobre los otros pasos necesarios para que las rutas del motor funcionen. – bowsersenior

+2

Para Rails 3.1 y posteriores, elimine el parámetro 'map' del bloque (simplemente elimine toda la parte' | map | '). –

26

tuve el mismo problema, y ​​nos pareció que en el documentation:

Desde ahora se puede montar un motor dentro de las rutas de aplicaciones, usted no tiene acceso directo al motor de url_helpers dentro de la aplicación. Cuando monta un motor en las rutas de una aplicación, se crea un ayudante especial para permitirle hacer eso.Considere este escenario:

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

Ahora, puede utilizar el ayudante my_engine dentro de su aplicación:

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

para el código dentro del motor, ¿tiene que anteponer las rutas a sus propios controladores con el nombre del motor también? ¿O puede simplemente usar 'classrooms_path' desde el interior del motor? – Jwan622

+0

Jwan622, para las rutas propias puedes usar ayudantes sin ningún prefijo. –

Cuestiones relacionadas