2009-08-12 31 views
1

Ruby On Rails路由框架中有没有一种方法根据单个路由中的某些逻辑来决定调用哪个控制器或动作?Ruby On Rails使用业务逻辑进行路由

例如,假设有一个网址zip/354,如果整数是偶数,我想调用foo动作,如果整数是奇数,我想调用bar动作。要使用伪红宝石:

map.connect 'zip/:id', :requirements=>{:id=>/^\d+$/} do |id| 
    :controller=>'c', :action=>'foo' if id.to_i % 2 == 0 
    :controller=>'c', :action=>'bar' if id.to_i % 2 != 0 
end 

回答

4

我不是太肯定的事情路由的一面,但你可以基于其他行动有行动呼吁:ID

def zip 
    id = params[:id].to_i 
    if(id%2 == 0) 
    foo 
    else 
    bar 
    end 
end 

但是你可能有虽然的已经。

3

我尝试做一些实验与我的路线,这似乎工作

# route to the even action 
map.connect 'foo/:code', :controller => 'bar', 
     :action => 'even', :requirements => { :code => /\d+(2|4|6|8|0)/ } 

# route to the odd action 
map.connect 'foo/:code', :controller => 'bar', 
     :action => 'odd', :requirements => { :code => /\d+(1|3|5|7|9)/ } 

这似乎有点哈克给我,我也不会认为它可能是相当脆弱的,但它确实落榜完成。

编辑:我没有在路由中放置任何锚(^或$),因为它们在路由需求中是不允许的。该框架意味着他们在那里。所以根据路由分析器,

/\d+(1|3|5|7|9)/ == /^\d+(1|3|5|7|9)$/