Macros and macro expansion


#1

I was looking at my controller code (Rails) and the
edit/create/update/new for
each are practically identical. So first I DRY’d the four methods in
each controller to just one and then I decided to write a single macro
for all my controllers.

This is the macro:

def self.edit_action_for(model, options = {})
model_class = Object.const_get(model)
define_method(:edit) do
edit_code = lambda do
@thing = model_class.find_by_id(params[:id]) || model_class.new
if request.post?
@thing.attributes = params[:impactable_area]
if @thing.save
flash[:notice] = “#{model.humanize} successfully saved.”
redirect_to :action => ‘list’
end
end
end
end
end

Then I expected this

edit_action_for :ImpactableArea

to create my “edit” method.

Problem is that it doesn’t :frowning:

So then I looked to see how I could do a macro expansion (as you can in
Lisp) to see what’s being produced and I couldn’t find anything…

HELP!

Edward


#2

Hi!

On 6/8/06, Edward K. removed_email_address@domain.invalid wrote:

define_method(:edit) do
end

So then I looked to see how I could do a macro expansion (as you can in
Lisp) to see what’s being produced and I couldn’t find anything…

HELP!

Edward


Posted via http://www.ruby-forum.com/.

Your code should work fine if you remove the lammbda from inside the
define_method block.


#3

ezmobius mob wrote:

Your code should work fine if you remove the lammbda from inside the
define_method block.

Perfect! Thank you.

(Is there a way to see the results of a macro expansion?)


#4

On 6/8/06, Edward K. removed_email_address@domain.invalid wrote:


Posted via http://www.ruby-forum.com/.

Unfortunately there is no easy way to see the expanded method. If
you really want to see it you can use parse_tree and ruby2c but its
not a very complete solution


#5

ezmobius mob wrote:

On 6/8/06, Edward K. removed_email_address@domain.invalid wrote:


Posted via http://www.ruby-forum.com/.

Unfortunately there is no easy way to see the expanded method. If
you really want to see it you can use parse_tree and ruby2c but its
not a very complete solution

Ok thanks for your help :slight_smile: