2012-06-02 18 views
10

Sto sviluppando un rubygem specifico per le applicazioni Rails e voglio aggiungere un controller dalla mia gem in modo che sia disponibile nell'app Rails (Simile a quello che devise fa con RegistrationsController, SessionsController) .Aggiungi un controller Rails da una gemma

Sul lato gemma:

Ho provato ad aggiungere il seguente app/controllers/samples_controller.rb

class SamplesController < ApplicationController 
    def index 
    . 
    . 
    end 
end 

E poi i miei binari percorsi aggiungerlo sia come:

match 'route' => 'samples#index' 

o

resources :samples 

Chiaramente ho qualcosa di sbagliato laggiù ma non ho idea di cosa sia? Devo richiedere esplicitamente il mio SampleController da qualche parte o un inizializzatore sull'app?

In questo momento sto ottenendo questo errore quando si accede al percorso

uninitialized constant SamplesController 

Grazie :)

risposta

0

Prima di tutto si ha un errore di battitura nel codice: AppicationController dovrebbe essere ApplicationController.

Quindi, non si sta seguendo le convenzioni di denominazione Rails (plurale per le risorse, ecc):

  • In tuoi percorsi avrebbe dovuto essere o resources :samples o resource :sample.
  • La classe del controller deve essere class SamplesController e
  • il nome file del controller deve essere samples_controller.rb.

seguire le convenzioni e si dovrebbe andare bene.

+0

Grazie ma continuo a ottenere la costante non inizializzata SamplesController' – rogeliog

+0

È possibile verificare che il file sia denominato correttamente (samples_controller.rb), definisce la classe corretta (class SamplesController Agis

+0

Sì, è appena stato ricontrollato. Ricorda che questo controller si trova all'interno di una gemma non presente nell'app Rails. non so se questo è un problema – rogeliog

0

per impostare il percorso, creare un file routes.rb nella directory di configurazione del progetto. Per farlo corrispondere sulla rotta di esempio, effettuare le seguenti operazioni: config/routes.rb

Rails.application.routes.draw do 
    <resource definition here> 
end 

app/controllers/samples_controller.rb

module Samples 
    class SamplesController < ApplicationController 
    def index 
     . 
     . 
    end 
    end 
end 

ricordarsi di includere il modulo nel controllore dell'applicazione

include 'samples' 

hai guardato questo sito:

http://coding.smashingmagazine.com/2011/06/23/a-guide-to-starting-your-own-rails-engine-gem/

20

Supponiamo che il tuo gioiello si chiami MyGem e che tu abbia un controller chiamato SamplesController che desideri utilizzare nell'app.Il controller dovrebbe essere definito come:

module MyGem 
    class SamplesController < ApplicationController 
    def whatever 
     ... 
    end 
    end 
end 

e nella directory gemma si dovrebbe vivere in app/controllers/my_gem/samples_controller.rb (non nella cartella lib).

Poi creare engine.rb nella cartella lib gemme/my_gem con il codice di

module MyGem 
    class Engine < Rails::Engine; end 
end 

È possibile scrivere percorsi all'interno del vostro gioiello, scrivendo la creazione routes.rb nella cartella config con il codice di

# my_gem/config/routes.rb 
Rails.application.routes.draw do 
    match 'route' => 'my_gem/samples#index' 
end 

Struttura finale qualcosa di simile

## DIRECTORY STRUCTURE 
# 

- my_gem/ 
    - app/ 
    - controllers/ 
     - my_gem/ 
     + samples_controller.rb 
    - config/ 
    + routes.rb 
    - lib/ 
    - my_gem.rb 
    - my_gem/ 
     + engine.rb 
     + version.rb 
    + my_gem.gemspec 
    + Gemfile 
    + Gemfile.lock 

Questo è tutto.

+3

per lo più corretto, ancora una cosa: aggiungi 'require 'my_gem/engine'' a' lib/my_gem.rb' – okliv

+0

Qual è lo scopo di './lib/my_gem/engine.rb'? ? –

Problemi correlati