single.的map.resource和命名约定

时间:2009-10-19 18:49:22

标签: ruby-on-rails naming-conventions controller routes

我对rails上的ruby比较新,所以这个问题可能很容易。 Rails做了很多魔术,我不知道在哪里查找这些东西,因为我不知道该框架的哪个部分应该受到责备。

我基本上做了authlogic_example并随后摆弄了代码。 我的routes.rb看起来像这样

 map.root :controller => "user_session", :action => "new" # optional, this just sets the root route
 map.resources :users
 map.resource :user_session

如您所见,我有一个名为 user_session 的控制器。 user_session 有三个操作 new create destroy 。我可以通过

联系控制器
 localhost:3000/user_sessions/[new,destroy,create]. 

我也可以在

处达成新动作
 localhost:3000/user_session/new

for destroy或create我在这里得到一个路由错误。根据{{​​3}},第一种情况应该是标准的:“给map.resource一个单数名称。默认的控制器名称仍然取自复数名称。”

我现在的问题是link_to只取控制器名称的单数,我只能达到新的,但不能销毁

<%= link_to "singular", :controller=>"user_session", :action=>"destroy" %> 
#=> http://localhost:3000/user_session/destroy
<%= link_to "plural",   :controller=>"user_sessions", :action=>"destroy" %>
#=> http://localhost:3000/user_session

这很令人困惑,甚至没有达到我的预期,但也会导致问题:我不能

redirect_to :controller=>"user_sessions", :action=>"destroy"

因为我被重定向到

http://localhost:3000/user_session

正如我已经提到的,我对rails很陌生,所以我可能还没有正确的思考方式。你能指点我描述这种行为吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您描述的行为是正确的。至少对于RESTful routing.,其中要采取的操作与请求类型相关联。

http://localhost:3000/user_session上的POST请求将创建会话。虽然同一URI上的DELETE请求会破坏会话。

如果您正在映射资源,那么您应该使用便捷方法来抽象出大部分资源。

<%= link_to "Login", create_user_session_url %>

但是,map.resources不提供破坏助手。所以你要么必须提出一个,要么明确提到:method =&gt; :删除

<%= link_to "Logout", {:controller => "user_sessions", :action => :destroy}, :method => :destroy %>

我更喜欢命名路由版本,其中包含config / routes.rb

map.logout '/logout', :controller => "sessions" , :action => :destroy

然后在我的观点中使用它:

<%= link_to "Logout", logout_url %>