Como mi primer post para Gema Roja, la idea es explicar como redefinir el código que crean los generadores de rails.
Desde rails 3, los generadores son mucho más modulares, además de ser definidos con la gema Thor y se pueden encadenar entre sí, como lo hace el generador de 'scaffold' el cual únicamente llama a otros generadores.
Entonces, si te encuentras haciendo los mismos cambios cada vez que generas código con los generadores de rails, tienes la opción de crear tu propio generador o cambiar los templates de código que usan los generadores que vienen con rails.
Para eso, por ejemplo, si queremos cambiar el código generado en un controlador por el generador scaffold, el template que usa rails está en
rails/railties/lib/rails/generators/rails/scaffold_controller/templates/controller.rb
por lo tanto, pueden tomar el contenido de ese archivo, modificarlo y guardarlo en
projecto_rails/lib/templates/rails/scaffold_controller/controller.rb
y cada vez que ejecuten rails g scaffold_controller controller_name o rails g scaffold model_name se usará ese template.
Entonces, el patrón comun es
projecto/**/generators/path/to/specific_generator/templates/template.extension yo creo en mi directorio lib/templates/path/to/specific_generator/template.extension para sobre escribir estos templates.
como ejemplo extra, dejo las redefiniciones que hice para un projecto en el cual uso la gema haml-rails, para cambiar sus templates también lo que resulta aplicable para cualquier generador
de
haml-rails/lib/generators/haml/scaffold/templates:
_form.html.haml edit.html.haml index.html.haml new.html.haml show.html.haml
a
lib/templates/haml/scaffold
_form.html.haml edit.html.haml index.html.haml new.html.haml show.html.haml
finalmente dejo un ejemplo de como dejé el template para controllers generados por scaffold
<% module_namespacing do -%>
class <%= controller_class_name %>Controller < ApplicationController
respond_to :html
def index
@<%= plural_table_name %> = <%= orm_class.all(class_name) %>
end
def show
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
end
def new
@<%= singular_table_name %> = <%= orm_class.build(class_name) %>
end
def edit
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
end
def create
@<%= singular_table_name %> = <%= orm_class.build(class_name, "params[:#{singular_table_name}]") %>
if @<%= orm_instance.save %>
redirect_to @<%= singular_table_name %>, <%= key_value :notice, "t('#{singular_table_name}.sucessfully_created')" %>
else
render <%= key_value :action, '"new"' %>
end
end
def update
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
if @<%= orm_instance.update_attributes("params[:#{singular_table_name}]") %>
redirect_to @<%= singular_table_name %>, <%= key_value :notice, "t('#{singular_table_name}.sucessfully_updated')" %>
else
render <%= key_value :action, '"edit"' %>
end
end
def destroy
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
@<%= orm_instance.destroy %>
redirect_to <%= index_helper %>_path, <%= key_value :notice, "t('#{singular_table_name}.sucessfully_destroyed')" %>
end
end
<% end -%>