使用Devise的Rails正确使用link_to方法的方式

3

我正在学习Rails和Devise用于身份验证,当用户登录到管理员页面时,我想创建一个注销链接。

正确的link_to代码书写方式是什么?

这是我的rake routes

admin_index        /admin/index(.:format)         {:controller=>"admin/home", :action=>"index"}
        new_user_session GET    /users/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
              home_index GET    /home/index(.:format)          {:controller=>"home", :action=>"index"}
                    root        /                              {:controller=>"home", :action=>"index"}

我尝试使用<%= link_to "登出", destroy_user_session_path %>,但是当我点击链接时,它会给我一个错误:

No route matches [GET] "/users/sign_out"

2个回答

6

Devise wiki推荐的devise示例应用程序中:

<% if user_signed_in? %>
  <li><%= link_to 'Edit account', edit_user_registration_path %></li>
  <li><%= link_to 'Sign out', destroy_user_session_path, :method=>'delete' %></li>
<% end %>

所以我只需要 :method => :delete,因为这是一个删除方法而不是一个提交方法?对于所有指向删除方法的链接都是这样吗? - Catfish
是的,你是对的,总是在你的RESTful路由中使用:method => :delete/:put/:post - Siwei
示例应用程序的链接已损坏。 - Roman Pushkin
@RomanPushkin 谢谢,我已经更新了代码,使用了一个新的示例,它的工作方式与之前的代码相同,并且不是来自一个废弃的代码库。 - Gareth

1

你的问题根源在于你在“link_to”中没有使用RESTful路由。

你应该更正你的代码为:

<%= link_to "Sign Out", destroy_user_session_path, :method => :delete %>

以便与路由匹配

DELETE /users(.:format)  {:action=>"destroy", :controller=>"devise/registrations" }

你是说我没有使用RESTful路由吗?几乎所有的路由都是从devise gem生成的。 - Catfish
好的,我的错误。我已经纠正了这个令人困惑的文本。你应该以RESTful的方式调用'link_to'(带有参数'method')。 - Siwei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接