ruby-on-rails - sesiones - ruby on rails tutorial pdf
¿Cómo puedo hacer que las rutas de un motor de Rails 3 estén disponibles para la aplicación host? (3)
Cambie config.routes
en su motor para:
Rails.application.routes.draw do # NOT MyEngineName::Engine.routes.draw
resources :classrooms
end
Como lo tiene, las rutas solo están disponibles en el espacio de nombres MyEngineName::Engine
y no en el resto de la aplicación de rieles de host.
Solía haber una publicación de blog con más información, pero desafortunadamente ya no está disponible:
Tengo una aplicación Rails 3 con varios motores que contienen funcionalidad adicional. Cada motor es un servicio separado al que los clientes pueden comprar acceso.
Sin embargo, tengo 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 la 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
intentando 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 a classrooms_path
desde cualquier otra vista produce el mismo error. Sin embargo, MyEngineName::Engine.routes.url_helpers.classrooms_path
llamar a MyEngineName::Engine.routes.url_helpers.classrooms_path
y hacer que funcione. Estoy pensando que podría haber definido mal las rutas, pero no puedo encontrar otra manera que funcione.
Intenté ejecutar la aplicación con Passenger (módulo independiente y módulo de Apache) y WEBrick (servidor de rieles). Usando los últimos Rieles de Git ( 7c920631ec3b314cfaa3a60d265de40cba3e8135
).
Para mí también ayuda a añadir.
require ''engine'' if defined?(Rails)
a mi archivo principal de gemas (lib / .rb).
Buen ejemplo: https://github.com/mankind/Rails-3-engine-example/blob/master/lib/dummy.rb
Tuve el mismo problema, y encontré esto en la documentation :
Como ahora puede montar un motor dentro de las rutas de la aplicación, no tiene acceso directo a url_helpers del motor dentro de la aplicación. Cuando monta un motor en las rutas de una aplicación, se crea un ayudante especial que le permite hacerlo. Considere tal 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