Come posso fare rotte da un motore Rails 3 disponibili per l'applicazione host?
-
08-10-2019 - |
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
).
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