Comment puis-je faire des itinéraires à partir d'un moteur Rails 3 disponible pour l'application hôte?
-
08-10-2019 - |
Question
J'ai un Rails 3 application avec plusieurs moteurs contenant des fonctionnalités supplémentaires. Chaque moteur est un service distinct que les clients peuvent acheter un accès à.
Je suis, cependant, un problème avec les routes des moteurs qui ne sont pas facilement accessibles aux contrôleurs et vues.
contrôleur:
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
dans le moteur:
MyEngineName::Engine.routes.draw do
resources :classrooms
end
config/routes.rb
dans l'application:
Seabed::Application.routes.draw do
mount MyEngineName::Engine => '/engine'
...
end
lib/my_engine_name.rb
dans le moteur:
module MyEngineName
class Engine < ::Rails::Engine
end
end
essayer d'aller aux résultats de /classrooms/new
dans
NoMethodError in Classrooms#new
Showing app/views/classrooms/_form.html.haml where line #1 raised:
undefined method `hash_for_classrooms_path' for #<Module:0x00000104cff0f8>
et d'essayer d'appeler classrooms_path
de toute autre vue des résultats dans la même erreur.
Je peux cependant appeler MyEngineName::Engine.routes.url_helpers.classrooms_path
et le faire fonctionner. Je pense que je pourrais avoir défini le mal de routes, mais ne peut pas trouver un autre moyen qui fonctionne.
Essayé à l'application en cours d'exécution avec les deux passagers (autonome et module Apache) et WEBrick (rails de serveur). En utilisant les dernières Rails de Git (7c920631ec3b314cfaa3a60d265de40cba3e8135
).
La solution
Changement config.routes
dans votre moteur:
Rails.application.routes.draw do # NOT MyEngineName::Engine.routes.draw
resources :classrooms
end
La façon dont vous l'avez, les routes ne sont disponibles que dans l'espace de noms MyEngineName::Engine
et non pas dans le reste de l'hôte rails application.
Il y avait autrefois un billet de blog avec plus d'informations, mais malheureusement, il est plus disponible:
Autres conseils
J'ai eu le même problème, et trouvé cela dans la documentation :
Puisque vous pouvez maintenant monter un moteur à l'intérieur des voies d'application, vous n'avez pas accès direct aux url_helpers de moteur à l'intérieur des applications. Lorsque vous montez un moteur dans une des voies d'application, une aide spéciale est créé pour vous permettre de le faire. Considérons un tel scénario:
# config/routes.rb
MyApplication::Application.routes.draw do
mount MyEngine::Engine => "/my_engine", :as => "my_engine"
get "/foo" => "foo#index"
end
Maintenant, vous pouvez utiliser l'assistant de my_engine dans votre application:
class FooController < ApplicationController
def index
my_engine.root_url #=> /my_engine/
end
end
Pour moi aussi aider à ajouter
require 'engine' if defined?(Rails)
à mon fichier de pierres précieuses (lib / .rb).
Bon exemple - https: // github .com / homme / Rails-3-moteur-exemple / blob / maître / lib / dummy.rb