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
答案 0 :(得分:4)
我对路由方面不太确定,但您可以根据以下操作调用另一个操作:id
def zip
id = params[:id].to_i
if(id%2 == 0)
foo
else
bar
end
end
但你可能已经有了。
答案 1 :(得分: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)$/