ruby on rails - Rutas nombradas en motores de rieles montados
ruby-on-rails ruby-on-rails-3 (3)
Estoy haciendo un pequeño motor de rieles que montura así:
mount BasicApp::Engine => "/app"
Usando esta respuesta , he verificado que todas las rutas en el motor son las correctas:
Sin embargo, cuando conecto (dentro del motor) a una ruta con nombre (definida dentro del motor) obtengo este error
undefined local variable or method `new_post_path'' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>
Ejecutar "ruta de rastreo" comprueba claramente que "new_post" debe ser una ruta con nombre, por lo que no tengo idea de por qué Rails (3.1.0) no puede resolverlo. Cualquier ayuda es bienvenida
mi config / route.rb (para el motor) se ve así
BasicApp::Engine.routes.draw do
resources :posts, :path => '''' do
resources :post_comments
resources :post_images
end
end
Debo agregar que es y motor aislado. Sin embargo, las rutas como main_app.root_path funcionan bien, mientras que root_path no funciona
La manera correcta
Creo que la mejor solución es llamar a new_post_path
en el proxy de rutas del motor, que está disponible como un método de ayuda. En su caso, el método de ayuda se establecerá de manera predeterminada en basic_app_engine
, por lo que puede llamar a basic_app_engine.new_post_path
en sus vistas o ayudantes.
Si lo desea, puede establecer el nombre de una de dos maneras.
# in engine/lib/basic_app/engine.rb:
module BasicApp
class Engine < ::Rails::Engine
engine_name ''basic''
end
end
o
# in app/config/routes.rb:
mount BasicApp::Engine => ''/app'', :as => ''basic''
En cualquier caso, podría llamar a basic.new_posts_path
en sus vistas o ayudantes.
De otra manera
Otra opción es no utilizar un motor montado y, en su lugar, hacer que el motor agregue las rutas directamente a la aplicación. Thoughtbot''s HighVoltage hace esto. No me gusta esta solución porque es probable que cause conflictos en el espacio de nombres cuando agrega muchos motores, pero funciona.
# in engine/config/routes.rb
Rails.application.routes.draw do
resources :posts, :path => '''' do
resources :post_comments
resources :post_images
end
end
# in app/config/routes.rb:
# (no mention of the engine)
utilice lo siguiente en su aplicación para acceder a las rutas del motor
MyApp::Engine.routes.url_helpers.new_post_path
En Rails 4 la directiva engine_name
no funcionó para mí.
Para acceder a una ruta específica definida en las rutas del motor desde la vista o el controlador del motor, terminé usando el detallado
BasicApp::Engine.routes.url_helpers.new_post_path
Recomiendo definir un método de ayuda simple para que esto sea más útil
# in /helpers/basic_app/application_helper.rb
module BasicApp::ApplicationHelper
def basic_app_engine
@@basic_app_engine_url_helpers ||= BasicApp::Engine.routes.url_helpers
end
end
Con esto en su lugar, ahora puede usar
basic_app_engine.new_post_path
En caso de que necesite acceder a su ayudante de aplicación principal desde el motor, puede usar main_app
:
main_app.root_path