MVC dentro de un plugin

por lo que he visto en el video de la ponencia “Programa en Rails como
si jugases con Lego” veo que es posible poner los MVCs dentro de la
carpeta vendor/plugins, el caso es que por mas vueltas que le he dado
no he conseguido que funcionase, la estructura que tengo es tal que así

  • tonto_plugin
    • init.rb
    • lib
      • tonto_plugin.rb
      • controllers
        • welcome_controller.rb
      • helpers
      • models
      • views
        • layouts
          • welcome.html.erb
        • welcome
          • index.html.erb

tengo las variables inicializadas en el init.rb del plugin tal que asi

require File.dirname(FILE) + ‘/lib/tonto_plugin’

controller_path = File.join( directory, ‘lib/app’, ‘controllers’ )
helper_path = File.join( directory, ‘lib/app’, ‘helpers’ )
model_path = File.join( directory, ‘lib/app’, ‘models’ )

$LOAD_PATH << controller_path
Dependencies.load_paths << controller_path
config.controller_paths << controller_path

$LOAD_PATH << helper_path
Dependencies.load_paths << helper_path
config.helper_paths << helper_path

$LOAD_PATH << model_path
Dependencies.load_paths << model_path
config.model_paths << model_path

y luego en el controlador para que encuentre la vista y el layout
correspondiente
class WelcomeController < ApplicationController
layout “welcome”
self.template_root = File.join( File.dirname(FILE), ‘…’,
‘views’ )

def index; end
end

en principio debería valer con lo que tengo en el init ¿no?

Gracias por la ayuda e info que pueda orientarme un poco.
Un saludo.

Hola,

es posible poner los MVCs dentro de la carpeta vendor/plugins, el caso es que por mas vueltas que le he dado
no he conseguido que funcionase, la estructura que tengo es tal que así

es posible, sí… la cosa es que has copiado el código de aquellas
maneras :wink:

require File.dirname(FILE) + ‘/lib/tonto_plugin’

esto no lo necesitas, en principio. Al estar el fichero dentro de lib
está ya disponible para usarlo donde quieras. A no ser que quieras
ejecutar algo en el momento de la inicialización no necesitarías el
require. Rails lo sabe encontrar solo.

$LOAD_PATH << controller_path
Dependencies.load_paths << controller_path
config.controller_paths << controller_path

correcto

$LOAD_PATH << helper_path
Dependencies.load_paths << helper_path

correcto

config.helper_paths << helper_path

Esto no lo has sacado de la presentación… te lo has inventado un poco
:wink: helper_paths no existe y de hecho si intentas arrancar el servidor
te lo dice directamente en el log. Te pasa lo mismo con el model_paths

Por aquello de ser un poco DRY, tu init.rb podría ser tal que así

controller_path = File.join( directory, ‘lib’,‘app’, ‘controllers’ )
helper_path = File.join( directory, ‘lib’,‘app’, ‘helpers’ )
model_path = File.join( directory, ‘lib’,‘app’, ‘models’ )

$LOAD_PATH << controller_path << helper_path << model_path
Dependencies.load_paths << controller_path
config.controller_paths << controller_path

Ahí estás añadiendo al LOAD_PATH y a las dependencias los directorios de
controllers, helpers y modelos. De esta forma Rails va a ser capaz de
encontrarlos cuando los necesite. Luego además añadimos a la variable
especial que se usa para buscar los controllers la ruta del controller.
Con eso te vale

y luego en el controlador para que encuentre la vista y el layout
correspondiente
class WelcomeController < ApplicationController
layout “welcome”
self.template_root = File.join( File.dirname(FILE), ‘…’,
‘views’ )

eso te dará un error. Si te fijas en la presentación eso dice que es PRE
rails 2. En Rails 2 se hace tal que así

layout “welcome”
append_view_path File.join(File.dirname(FILE),’…’,‘views’)

Una vez bien copiado todo, te debería funcionar :wink:

saludos,

javier ramírez

he tenido un pequeño error… en el código del init.rb no te había
añadido los directorios helper_path y model_path a las dependencies.
Tiene que ser así


controller_path = File.join( directory, ‘lib’,‘app’, ‘controllers’ )
helper_path = File.join( directory, ‘lib’,‘app’, ‘helpers’ )
model_path = File.join( directory, ‘lib’,‘app’, ‘models’ )

$LOAD_PATH << controller_path << helper_path << model_path
Dependencies.load_paths << controller_path << helper_path << model_path
config.controller_paths << controller_path

Ahora sí… suerte

javier ramírez

Muchas gracias Javier, muy amable. ya tengo un plugin que dice hola
jejeje.
voy a repasar el pdf de la presentación con más atención para evitar
que me vuelva a pasar lo de “… copiar código de aquellas
maneras… ;-)”

Un saludo. gracias de nuevo.