Definisco dinamicamente un metodo in un modulo e vorrei verificare che una volta che il metodo è associato a un'istanza di classe che il corpo del metodo sia quello che io ' Mi aspetto Esiste un modo per produrre (come testo) il corpo di un metodo?Meta-programmazione: corpo del metodo di output come testo
Modulo 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
classe di essere mescolato con:
class VendorOrdersController < ApplicationController
# GET /vendor_orders
# GET /vendor_orders.xml
require 'controller_mixins'
include ControllerMixin
<rest of class>
Così mi piacerebbe vedere l'attuazione del mixin quando applicata a VendorOrdersController
probabilmente attraverso script/console
per convenienza.
UPDATE: Per @ ~/Ho salvato la stringa in una variabile e puts
'd it. Ha funzionato perfettamente. Che ha portato alla luce un errore nel mio codice (la ragione per cui volevo vedere il codice in primo luogo). Il codice sotto è molto meglio e funziona come previsto.
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 è il tuo amico – shingara
Probabilmente vorrai usare 'here documents' ('CODICE << - ... CODE') invece di stringhe concatenate. Il formato è molto più bello. – Chubas
Perché non ho sentito parlare di questi "documenti qui" Questo è un invio di DIO. Grazie. Buona spiegazione (sul blog di qualcun altro): http://blog.commonthread.com/2007/12/20/tip-ruby-here-document – SooDesuNe