Rails devise在注销后从数据库中删除用户
我的设计宝石出现问题。当我与用户注销时,devise将我的用户从我的mysql数据库中删除。我昨天首先发现了这个错误,然后才开始工作。我不记得什么注册和登录也是可能的。Rails devise在注销后从数据库中删除用户
用户控制器
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
end
def destroy
@user = User.find(params[:id2])
@user.destroy
respond_to do |format|
format.html { redirect_to root_url}
end
end
end
注销-Link的
<%= link_to " Logout", destroy_user_session_path(:id2 => current_user.id), :class => "btn btn-danger icon-share-alt ",:style=>"font-family: FontAwesome;font-weight: bold;color:black", :method => :delete %>
用户模型
class User < ActiveRecord::Base
rolify
belongs_to :ressourcen
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :vorname, :nachname, :email, :password, :password_confirmation, :roleid,:id
validates :email, :uniqueness => true
你定制/覆盖色器件会议控制器?
如果不是你的注销链接或许应该是这样的:
<%= link_to " Logout", destroy_user_session_path, :class => "btn btn-danger icon-share-alt ",:style=>"font-family: FontAwesome;font-weight: bold;color:black", :method => :delete %>
设计不知道:id2
参数是什么。
尝试更换此:
destroy_user_session_path
与此:
destroy_session_path(:user_id => current_user.id)
,比SessionsController摧毁你的会话。这样,每当有人点击注销链接时,你都会毁掉你的用户。
“找不到id = sign_out的用户” – user3250164
某处您正在向User.find函数传递“sign_out”。尝试在控制台中运行rake路由并查看** destroy_session_path **带你到哪里。 – ObiVanKaPudji
这似乎很奇怪。如果设计和路线是以默认的方式设置的,我看不出这是怎么发生的。这是什么:
rake routes
向您显示destroy_user_session_path?如果你还没有覆盖色器件的SessionsController,并没有改变色器件的路线,为destroy_user_session的唯一入口应该是这个样子:
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
它绝对不应该去你的UsersController的。它应该去设计的SessionsController。
在任何情况下,这种注销链接的作品对我来说:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
destroy_user_session_path应该不需要用户ID。它只会破坏会话中的用户,所以不需要id。
更新:
当您注销时,您返回哪个页面?如果你自己没有定义SessionsController并且没有覆盖after_sign_out_path(),它应该尝试返回到root_path。如果您的路由中没有定义根,它将返回到“/”。您能否从日志文件(例如development.log)中确认您点击“注销”链接时发生的情况?哪些操作被调用以及什么时候/什么SQL查询被调用?就在您点击链接时,而不是在您稍后浏览以查看用户时。另外,你的routes.rb中的devise_for行是什么样的?当你只点击注销链接时,就值得深入了解发生了什么。
据我所知,devise里面唯一可以从数据库中删除用户的东西是RegistrationsController.destroy(),如果DELETE请求被发送给/ users(没有id),它将被调用。它会从会话中找到当前登录的用户(这就是为什么它不需要id)并销毁它们。在标准设计视图中,它看起来像只能从devise/registrations/edit.html.erb调用,并且可能你没有这样做。
'destroy_user_session DELETE /users/sign_out(.:format)devise/sessions#destroy' destroy_user_session正在使用GET-Path ..我改变了它,但它也不起作用。用户控制器仍然没有找到用户。 – user3250164
查看我更新的答案;希望那里有一些有用的指针。 – Tim
不幸的是,这也不起作用。我也认为我没有会话控制器...只是一个User_controller。当我使用不带参数的“destroy_user_session_path”时,控制器如何找到用户? – user3250164
看一下[会话控制器源代码](https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb)。它调用[sign_out here](https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/sign_in_out.rb)。 Devise知道current_user – mikeorr85