在 rails 4 中从控制器注销

Signout from a controller in rails 4

我想退出控制器。我的控制器看起来像

def update
if @attendance.update_attribute(:logout_at, Time.now.localtime)
  redirect_to signout_path and return
end
end

我的路线看起来像

  devise_scope :employees do
     get "signout" => "devise/sessions#destroy"

  end

  devise_for :employees, :controllers => { registrations: 'registrations' }

但是报错

Unknown action

Could not find devise mapping for path "/signout". This may happen for two reasons: 1) You forgot to wrap your route inside the scope block. For example: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) You are testing a Devise controller bypassing the router. If so, you can explicitly tell Devise which mapping to use: @request.env["devise.mapping"] = Devise.mappings[:user]

我该怎么做?请帮帮我。

提前致谢。

您正在重定向,向 devise#sessions#destroy 发出 GET 请求,这是一条不存在的路由。 Devise 中的 signout 路由映射到 DELETE 请求。而不是重定向你应该 directly call the sign_out method Devise 为你提供。之后一定要将用户重定向到某个地方,也许是登录页面。

旁注,在 Rails 4 中,您可以直接调用 update(attribute: value)。您也不需要调用 return

def update
  @attendance.update(logout_at: Time.now.localtime)
  sign_out
  redirect_to login_path      
end

我删除了包装更新调用的 if 语句。通过使用一个,您暗示可能有一个原因导致保存不会发生,例如,由于验证错误,您需要向用户提供反馈。但在这种情况下,它更有可能是一个例外,因为用户没有输入任何数据。您可以在应用程序级别处理它。