2011-06-14 47 views
0

我试图完成以下使用的link_to时添加在路由文件的连接:为什么在轨道2

<%=的link_to“退出”,{:控制器 =>“用户”, :action =>'logout'},:class =>'menulink2'%>

但它没有工作,它总是将我重定向到show view。我必须有以下我的routes.rb:

map.connect '用户/注销', :控制器=> '用户',:动作=> '退出'

为什么没有栏杆识别我正在传递的操作('注销')?

+0

这不是控制器名称的问题吗? – apneadiving 2011-06-14 20:31:36

+0

对不起,是一个类型-O – tiiin4 2011-06-14 20:38:54

+0

奇怪,它符合http://api.rubyonrails.org/v2.3.8/您是否尝试使用命名路线? – apneadiving 2011-06-14 20:53:28

回答

0

该逻辑必须在某处指定。必须将散列{:controller => 'users', :action => 'logout'}映射到一个url,并且在rails中完成的位置是routes.rb文件。在旧版本的轨道许多routes.rb带着末默认:

map.connect ':controller(/:action/(:id(.:format)))'

这将让这个几乎任何:控制器:动作哈希可以指定,然后发送到host.url/:controller/:action


有了更现代的版本,基于资源的路由是大热门,和控制器不遵循Rails的REST约定(即只有:index,:show,:create,:new,:edit,:update,:destroy方法),一般必须有他们的路线以某种方式明确指定。

(无论是与map.resources :users, :collection => {:get => :logout}map.connect('some_url', :controller => 'users', :action => 'logout'})


我猜,但他们这样做的原因可能是控制器的行动其实只是它的公共方法。

在您的控制器中使用公共方法通常不错,它们不是用于测试目的的网址结束点。

例如,您可以将before_filter作为公共方法,您可能需要测试而不必在测试代码中使用@controller.send(:your_before_filter_method)

因此,他们将资源操作列入白名单,并使其他人无法访问。让我看看rails更新日志,看看我是否正确。