我对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很陌生,所以我可能还没有正确的思考方式。你能指点我描述这种行为吗?我该如何解决这个问题?
答案 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 %>