2012-02-18 9 views
22

Tengo una clase que estoy tratando de usar en mi controlador en la acción de índice.¿Dónde colocar clases personalizadas para que estén disponibles globalmente para la aplicación Rails?

Para simplificarlo, parece que este

class PagesController < ApplicationController 
    def index 
    @front_page = FrontPage.new 
    end 
end 

FrontPage es una clase que he definido. Para incluirlo, lo he colocado en la carpeta/lib /. He tratado de require 'FrontPage', require 'FrontPage.rb', require 'front_page', y cada uno de los que tienen el camino antepuesto, por ejemplo require_relative '../../lib/FrontPage.rb'

me siguen dando uno de los siguientes mensajes: cannot load such file -- /Users/josh/src/ruby/rails/HNReader/lib/front_page o uninitialized constant PagesController::FrontPage

¿Dónde pongo este archivo/cómo ¿Lo incluyo en un controlador para que pueda crear una instancia de un objeto?

Ésta es Rails 3.1.3, Ruby 1.9.2, OS X Lion

+3

¿Has probado 'require 'front_page''? – Mischa

+0

@Mischa Sí, todos los que requieren argumentos deben estar entre comillas. Gracias por señalar eso. El uso de ese 'require' da como resultado el error' no se puede cargar ese archivo - front_page' –

Respuesta

4

Sólo tenemos que cargar el archivo,

class PagesController < ApplicationController 
    require 'front_page.rb' 
    def index 
    @front_page = FrontPage.new 
    end 
end 

lib/front_page.rb

class FrontPage 
end 

También podemos configurar application.rb en carga automática estos archivos

# Custom directories with classes and modules you want to be autoloadable. 
# config.autoload_paths += %W(#{config.root}/extras) 

La segunda opción sería una solución preferible.

+0

Sí, lo he intentado. Lo puse fuera de la definición de la clase, pero al verificar ahora, ponerlo dentro de la definición de la clase todavía produce 'no se puede cargar ese archivo - front_page.rb' –

7

El archivo se llamó FrontPage.rb. Cambiar el nombre a 'front_page.rb', pero dejando el nombre de la clase como 'FrontPage' resolvió el problema.

+3

La convención no es específica de Java. http://en.wikipedia.org/wiki/CamelCase – 0112

23

Debería poder utilizar require 'front_page' si coloca front_page.rb en algún lugar de su ruta de carga. Es decir: este debe trabajo:

require 'front_page' 
class PagesController < ApplicationController 
    def index 
    @front_page = FrontPage.new 
    end 
end 

para comprobar su ruta de carga, intente esto:

$ rails console 
ree-1.8.7-2011.03 :001 > puts $: 
/Users/scottwb/src/my_app/lib 
/Users/scottwb/src/my_app/vendor 
/Users/scottwb/src/my_app/app/controllers 
/Users/scottwb/src/my_app/app/helpers 
/Users/scottwb/src/my_app/app/mailers 
/Users/scottwb/src/my_app/app/models 
/Users/scottwb/src/my_app/app/stylesheets 
# ...truncated... 

Se puede ver en este ejemplo, la primera línea es el directorio del proyecto lib, que es donde dijiste que tu front_page.rb vive.

Otra cosa que puedes hacer es añadir esto en su config/application.rb:

config.autoload_paths += %W(#{config.root}/lib) 

Eso debe hacerlo de modo que ni siquiera necesita el require; en su lugar, Rails lo autocargará (y todo lo demás en tu directorio lib, así que ten cuidado).

+0

carga automática es la clave – Donato

+0

gracias - pregunta: ¿es peligroso o arriesgado cargar automáticamente * todo * en el directorio lib? – BKSpurgeon

Cuestiones relacionadas