ruby-on-rails ruby-on-rails-3 mount rails-engines named-routing

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