2012-06-02 17 views
10

Estoy desarrollando un rubygem específicamente para aplicaciones Rails y quiero agregar un controlador de mi gema para que esté disponible en la aplicación Rails (Similar a lo que hace devise con RegistrationsController, SessionsController) .Agregue un controlador Rails de una gema

Por el lado de la gema:

He intentado añadir el siguiente app/controllers/samples_controller.rb

class SamplesController < ApplicationController 
    def index 
    . 
    . 
    end 
end 

Y luego en mis rieles rutas añadir ya sea como:

match 'route' => 'samples#index' 

o

resources :samples 

Claramente, tengo algo mal por allá pero no tengo idea de qué es? ¿Necesito explícitamente requerir mi SampleController en algún lugar o un inicializador en la aplicación?

En este momento estoy recibiendo este error al acceder a la ruta

uninitialized constant SamplesController 

Gracias :)

Respuesta

0

En primer lugar hay un error tipográfico en el código: AppicationController debería ser ApplicationController.

Entonces, usted no está siguiendo las convenciones de nomenclatura Rieles (plural de recursos, etc.):

  • En sus rutas tendría que ser resources :samples o resource :sample.
  • Su clase de controlador debe ser class SamplesController y
  • el nombre de archivo del controlador debe ser samples_controller.rb.

Siga las convenciones y estará bien.

+0

Gracias pero todavía obtengo 'constante no inicializada SamplesController' – rogeliog

+0

¿Puede verificar que su archivo se nombre correctamente (samples_controller.rb), define la clase adecuada (clase SamplesController Agis

+0

Sí, solo lo comprobé dos veces. Recuerde que este controlador está dentro de una gema que no está en la aplicación Rails. no sé si ese es un problema – rogeliog

0

para configurar su ruta, cree un archivo routes.rb en el directorio config de su proyecto. Para tenerlo coincide con la ruta de la muestra, haga lo siguiente: 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 

recuerde incluir el módulo en el controlador de aplicación

include 'samples' 

¿Has mirado en este sitio:

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

20

Supongamos que su gema se llama MyGem y tiene un controlador llamado SamplesController que desea usar en la aplicación.El controlador debe ser definida como:

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

y en el directorio de joya que debe vivir en app/controllers/my_gem/samples_controller.rb (no en la carpeta lib).

A continuación, cree engine.rb en la carpeta de gemas lib/my_gem con código

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

Puede escribir rutas dentro de su joya escribiendo crear routes.rb en la carpeta de configuración con código

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

Estructura final algo como esto

## 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 

Eso es todo.

+3

en su mayoría correcto, una cosa más: agregar 'require 'my_gem/engine'' a' lib/my_gem.rb' – okliv

+0

¿Cuál es el propósito de './lib/my_gem/engine.rb' ? –

Cuestiones relacionadas