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).

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top