2011-07-01 12 views
11

He estado trabajando en mi primer plugin de Rails 3, para empaquetar una función de ayuda sencilla que me gusta tener en el ApplicationHelper de todas mis aplicaciones. Puede ver el código completo on Github.Crear una sencilla gema de ayudante de texto de Rails 3

Aquí es mi primer intento:

## lib/semantic_id.rb ## 

require 'semantic_id/version' 

module ::ActionView::Helpers::TextHelper 

    def semantic_id 
    string = String.new 

    case 
    when controller.action_name =~ /new|edit/ 
     string += controller.action_name + "_" 
    when controller.action_name =~ /index|create/ 
     string += controller.controller_name 
    else 
     string += controller.controller_name.singularize 
    end 

    string += "_view" 
    end 

end 

Ahora, esto funciona, pero como yo lo entiendo este no es el 'Rails 3 Way' de extender ActiveSupport o cualquier otro módulo de rieles. No he podido encontrar mucha documentación sobre cómo se supone que debes construir una gema de Rails 3. Traté de seguir la Guía de Rails, pero el método dado allí para agregar ayudantes no funcionó, o de lo contrario me faltaba algo.

Mi pregunta es: dando el código de arriba como un ejemplo de la funcionalidad que estoy buscando, ¿cómo convertir esto en una gema de plugin de Rails 3?

Gracias!

+0

debe intentar usar la gema del joyero en la creación de su gema :) – corroded

+1

En cuanto a las respuestas dadas, estoy roto porque confié en ambos para resolver este problema. El código de Alex me acercó, pero todavía me costaba imaginar cómo hacerlo cargar en la aplicación hasta que Noli publicó sus enlaces a mejores ejemplos de cómo armar una railtie. Así que, al final, la respuesta de Alex me ayudó a comenzar, mientras que Noli me ayudó a terminar. Tengo que ir con Noli en este caso, ya que sus enlaces hicieron la diferencia al final. ¡Gracias a ambos por sus respuestas consideradas! – Andrew

Respuesta

17

El problema con lo que has hecho es que has vinculado la funcionalidad de tu gema a ActionView. Sería mejor hacerlo más genérico.

Para arreglar esto, debe empaquetar su código en su propio módulo y luego inyectar ese módulo en su entorno de visualización. Por ejemplo, poner su ayudante en su propio módulo (y archivo):

# lib/semantic_id/helper.rb 

module SemanticId 
    module Helper 
    def semantic_id 
     ... 
    end 
    end 
end 

después añadirlo al ActionView utilizando un Railtie:

# lib/semantic_id.rb 

require 'semantic_id/helper' 

ActiveSupport.on_load(:action_view) do 
    include SemanticId::Helper 
end 

desea separar la parte funcional de la ayudante de la parte que lo inserta en el marco. Su método contiene algún código específico de Rails, pero si no lo hiciera, esta técnica también le permitiría usarlo con Sinatra y otros frameworks.

En general, las agallas de su proyecto deben estar en lib/<project_name>/*.rb, y lib/<project_name>.rb solo debe hacer que la funcionalidad sea accesible.

+0

Esto ayuda, gracias. – Andrew

+0

Pero, ¿cómo probarías el método dentro del módulo? ¿No tienes que incluirlo en una clase? – Mohamad

Cuestiones relacionadas