2009-08-12 59 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)$/