原文的作者,十分推崇极度简洁的Router描述,以期达到提高速度和简洁本身的目标。
例如,作者很建议将Rails自己默认的路由':controller/:action/:id'删除,原因是这会妨碍简洁的RESTful发挥。
然而,尝试总是有不理想的时候:
有次在使用如下的测试代码:
对下面的路由
结果就得到了如下的错误提示:
[quote]ActionController::RoutingError: No route matches {
:action=>"destroy",
:controller=>"user_sessions"}[/quote]
错误提示说,delete(或者还有get post)方法,找不到创建的路由。那么,作者首先想到的就是怎么绕过去呢,那么定义个新的路由应该可以了吧,代码如下:
诚然,这样能解决问题,但是作者毕竟是有技术人的骨气的,不会这么容易就屈服的。于是,找到了一个比较好的解决办法
在test_helper.rb添加
例如,作者很建议将Rails自己默认的路由':controller/:action/:id'删除,原因是这会妨碍简洁的RESTful发挥。
然而,尝试总是有不理想的时候:
有次在使用如下的测试代码:
def test_logout_should_redirect_to_root_path
UserSession.create(User.first)
delete :destroy
assert_match /logged out/, flash[:notice]
assert_redirected_to root_path
end
对下面的路由
map.logout '/logout',
:controller => 'user_sessions',
:action => 'destroy',
:method => 'delete'
测试的时候
结果就得到了如下的错误提示:
[quote]ActionController::RoutingError: No route matches {
:action=>"destroy",
:controller=>"user_sessions"}[/quote]
错误提示说,delete(或者还有get post)方法,找不到创建的路由。那么,作者首先想到的就是怎么绕过去呢,那么定义个新的路由应该可以了吧,代码如下:
with_routing do |set|
set.draw do |map|
map.resource :user_sessions, :only => [:destroy]
map.root :controller => 'foobars', :action => 'index'
end
delete :destroy
assert_match /logged out/, flash[:notice]
assert_redirected_to root_path
end
诚然,这样能解决问题,但是作者毕竟是有技术人的骨气的,不会这么容易就屈服的。于是,找到了一个比较好的解决办法
在test_helper.rb添加
class ActionController::TestCase
# add a catch-all route for the tests only.
ActionController::Routing::Routes.draw { |map| map.connect ':controller/:action/:id' }
end