Domanda

Ho un 3 applicazione Rails con diversi motori contenenti funzionalità aggiuntive. Ogni motore è un servizio separato che i clienti possono acquistare l'accesso a.

Sono, tuttavia, avendo un problema con rotte da motori che non sono prontamente disponibili per i controllori e punti di vista.

Controller:

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 nel motore:

MyEngineName::Engine.routes.draw do
  resources :classrooms
end

config/routes.rb in app:

Seabed::Application.routes.draw do
  mount MyEngineName::Engine => '/engine'
  ...
end

lib/my_engine_name.rb nel motore:

module MyEngineName
  class Engine < ::Rails::Engine
  end
end

di tentare di andare ai risultati /classrooms/new in

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 il tentativo di chiamare classrooms_path da qualsiasi altro visualizzare i risultati nello stesso errore. Posso, però, chiamare MyEngineName::Engine.routes.url_helpers.classrooms_path e farlo funzionare. Sto pensando che avrei potuto definito il male vie, ma non riesco a trovare un altro modo che le opere.

provato a fare funzionare l'applicazione sia con passeggeri (stand-alone e il modulo Apache) e WEBrick (guide del server). Utilizzando le più recenti Rails da Git (7c920631ec3b314cfaa3a60d265de40cba3e8135).

È stato utile?

Soluzione

Cambia config.routes nel tuo motore a:

Rails.application.routes.draw do  # NOT MyEngineName::Engine.routes.draw
  resources :classrooms
end

Il modo in cui lo avete, i percorsi sono disponibili solo nello spazio dei nomi MyEngineName::Engine e non nel resto del paese ospitante rotaie applicazione.

Ci deve essere utilizzato un post sul blog con più informazioni, ma purtroppo non è più disponibile:

  • http: // blog
  • .loopedstrange.com / modesta-rubyist-archive / 3-plugins-part2-scrittura-un-motore-rails

Altri suggerimenti

Ho avuto lo stesso problema, e trovato questo nella documentazione :

Dal momento che ora è possibile montare un motore interno percorsi dell'applicazione, non si ha accesso diretto al url_helpers del motore all'interno di applicazioni. Quando si monta un motore in percorsi di un'applicazione, viene creato un aiutante speciale per consentire di farlo. Prendere in considerazione un tale scenario:

# config/routes.rb
MyApplication::Application.routes.draw do
  mount MyEngine::Engine => "/my_engine", :as => "my_engine"
  get "/foo" => "foo#index"
end

Ora, è possibile utilizzare l'helper my_engine all'interno della vostra applicazione:

class FooController < ApplicationController
  def index
    my_engine.root_url #=> /my_engine/
  end
end

Per me anche aiuto per aggiungere

require 'engine' if defined?(Rails)

per il mio file gemma principale (lib / .RB).

Il buon esempio - https: // GitHub .com / uomini / Rails-3-motore-esempio / blob / master / lib / dummy.rb

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top