设计注销链接问题(Rails 4)

Posted

技术标签:

【中文标题】设计注销链接问题(Rails 4)【英文标题】:Devise Signout link issue (Rails4) 【发布时间】:2014-01-16 03:21:21 【问题描述】:

我的 Rails 版本:

rails -v
Rails 4.0.2

我使用 Devise for users 模型。

退出链接是:

  <%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

当我点击链接时,我得到了这个错误:

AbstractController::ActionNotFound at /users/sign_out
The action 'show' could not be found for UsersController

通过执行 rake 路由,我得到了这个:

destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy

在 development.log 中登录

Started GET "/users/sign_out" for 127.0.0.1 at 2013-12-28 20:45:06 +0000

AbstractController::ActionNotFound - The action 'show' could not be found for UsersController:
  actionpack (4.0.2) lib/abstract_controller/base.rb:131:in `process'
  actionpack (4.0.2) lib/abstract_controller/rendering.rb:44:in `process'
  actionpack (4.0.2) lib/action_controller/metal.rb:195:in `dispatch'
  actionpack (4.0.2) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.0.2) lib/action_controller/metal.rb:231:in `block in action'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:48:in `call'
  actionpack (4.0.2) lib/action_dispatch/journey/router.rb:71:in `block in call'
  actionpack (4.0.2) lib/action_dispatch/journey/router.rb:59:in `call'
  actionpack (4.0.2) lib/action_dispatch/routing/route_set.rb:680:in `call'

我不明白为什么它会搜索表演动作。只是为了好玩,我在用户控制器和显示视图中创建了显示操作。然后它所做的就是重定向到 show 动作。不知道为什么。

如果您需要任何其他信息,请告诉我。 有什么线索吗?

【问题讨论】:

【参考方案1】:

如果您正在为用户使用设计模型并且正在使用用户资源,请确保在 /config/routes.rb 中的“resources :users”之前提到“devise_for :users”

【讨论】:

【参考方案2】:

我通过像这样创建 devise_scope 来修复它:

  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end

感谢@David 的帮助。

【讨论】:

这是放在 routes.rb 中的吗?编辑——将上面的代码放在我的 routes.rb 中为我修复了它。【参考方案3】:

您说您在 users_controller 中创建了 show 操作。您是否将其设置为执行以下操作:

 def show
    @user = current_user 
  end

注意:您的注销 url 正在变成类似 /users/sign_out 的东西,因为您已声明用户是资源。 Rails 路由所有资源丰富的路由 /user/:id 以显示用户控制器的操作。

【讨论】:

你说得对。但是,在将用户添加为路由中的资源之前,我遇到了一个不同的错误,并且删除方法仍然无法正常工作。错误是关于使用 GET 到 /sign_out URL。正如我所提到的,当我创建显示操作并单击退出时,它只是呈现显示视图......(顺便说一句,我做了你提到的只是为了测试它) @Stefanos.Ioannou 你能发布你的 routes.rb

以上是关于设计注销链接问题(Rails 4)的主要内容,如果未能解决你的问题,请参考以下文章

根据 AJAX 请求设计注销用户。导轨 3.1

React on Rails - 如何将登录链接更改为注销链接?

在 Rails 中使用 Devise 注销特定用户

Rails,设计认证,CSRF 问题

关于从 Rails 2 中所有浏览器中的所有活动会话自动注销的问题

并发请求未完成时无法注销设计用户