Estoy definiendo dinámicamente un método en un módulo, y me gustaría comprobar que una vez que el método está vinculado a una instancia de clase que el cuerpo del método es lo que yo ' Estoy esperando. ¿Hay alguna manera de producir (como texto) el cuerpo de un método?Meta-programación: cuerpo de método de salida como texto
Módulo controller_mixins.rb
:
module ControllerMixin
instance_eval "def search_by_vendor (*args) \n" \
" @#{self.class.name.sub(/Controller/, '').tableize} = #{self.class.name.sub(/Controller/, '')}.find_all_by_vendor_id(params[:vendor_id]) \n"\
"respond_to do |format| \n" \
" format.html { render :template=>'/#{self.class.name.sub(/Controller/, '').tableize}/index', :layout=>'vendor_info'} \n" \
" format.xml { render :xml => @#{self.class.name.sub(/Controller/, '').tableize} } \n" \
"end \n"\
"end \n"
end
clase se mezcla con:
class VendorOrdersController < ApplicationController
# GET /vendor_orders
# GET /vendor_orders.xml
require 'controller_mixins'
include ControllerMixin
<rest of class>
así que me gustaría ver la implementación del mixin cuando se aplica a VendorOrdersController
probablemente a través de script/console
por conveniencia.
ACTUALIZACIÓN: Per @ ~/Guardé la cadena a una variable y puts
'd it. Eso funcionó perfectamente. Lo que sacó a la luz un error en mi código (la razón por la que quería ver el código en primer lugar). El código a continuación es mucho mejor y funciona como se espera.
module ControllerMixin
def self.included(mod)
method_body = "def search_by_vendor \n" \
" @#{mod.name.sub(/Controller/, '').tableize} = #{mod.name.sub(/Controller/, '')}.find_all_by_vendor_id(params[:vendor_id]) \n"\
"respond_to do |format| \n" \
" format.html { render :template=>'/#{mod.name.sub(/Controller/, '').tableize}/index', :layout=>'vendor_info'} \n" \
" format.xml { render :xml => @#{mod.name.sub(/Controller/, '').tableize} } \n" \
"end \n"\
"end \n"
puts method_body
mod.class_eval(method_body)
end
end
define_method es su amigo – shingara
Probablemente querrá utilizar 'aquí documentos' ('CÓDIGO << - ... CODE') en lugar de cadenas concatenadas. El formato es mucho más agradable. – Chubas
Por qué no he oído hablar de estos 'aquí documentos' Este es un enviado de DIOS. Gracias. Buena explicación (en el blog de otra persona): http://blog.commonthread.com/2007/12/20/tip-ruby-here-document – SooDesuNe