Numerical Action Names

I have a controller for a product, and I want the actions to reflect
the different models which are numbers. Simply using a number for the
action name doesn’t seem to work:

class ClickController < ApplicationController

def index
end

def 100
end

def 200
end
end

I also have this named route in my routes file:

map.click ‘/products/click/:action’, :controller => ‘click’

If I have a non-numeric value for action, this works fine. I use it
for a different product (“command_path(:datacollector))”–which
properly generates “/products/command/datacollector”). In Rails 1.2.x
I was able to prepend the numeric action name with an underscore
(i.e., _100, _200, etc.) and everything worked as expected. In Rails
2.0 this no longer works. Someone suggested I create a custom route:

map.click ‘/products/click/:model’, :controller => ‘click’, :action =>
‘dispatch’, :requirements => {:model => /\d{3}/}, :model => nil

I have a dispatch action in my controller:

def dispatch(model = nil)
if model.nil?
index
render(:action => ‘index’)
else
# whatever
end
end

The else statement NEVER executes. I have tried the following paths:

/products/click
/products/click/100
/products/click/200

Every path renders the index action.

What am I missing? What can I do?

Thanks.

On 17 Jan 2008, at 01:07, partydrone wrote:

I have a controller for a product, and I want the actions to reflect
the different models which are numbers. Simply using a number for the
action name doesn’t seem to work:

actions are methods, method names can’t start with a digi.

map.click ‘/products/click/:model’, :controller => ‘click’, :action =>
‘dispatch’, :requirements => {:model => /\d{3}/}, :model => nil

Do you need the :model => nil ?

The else statement NEVER executes. I have tried the following paths:

/products/click
/products/click/100
/products/click/200

model should materialize as params[:model], not as an argument to your
dispatch method.

Fred

“model should materialize as params[:model], not as an argument to
your dispatch method.”

Silly me. That was my mistake.

Thanks.

Next question is how do I dynamically execute an action? Here’s what I
mean: I have my dispatch action. If :model is nil, I execute then
render the index action:

def dispatch
if params[:model].nil?
index
render(:action => ‘index’)
else
action = “click_#{params[:model]}”
# execute action
render(:action => action)
end
end

At the moment, I’m setting some variables in my action that aren’t
available in my view. How do I get them there?

Thanks.

On 17 Jan 2008, at 01:46, partydrone wrote:

 action = "click_#{params[:model]}"
 # execute action
 render(:action => action)

end
end

You just need to call the method (eg via send)

Fred

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs