在 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 语句。通过使用一个,您暗示可能有一个原因导致保存不会发生,例如,由于验证错误,您需要向用户提供反馈。但在这种情况下,它更有可能是一个例外,因为用户没有输入任何数据。您可以在应用程序级别处理它。
我想退出控制器。我的控制器看起来像
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 语句。通过使用一个,您暗示可能有一个原因导致保存不会发生,例如,由于验证错误,您需要向用户提供反馈。但在这种情况下,它更有可能是一个例外,因为用户没有输入任何数据。您可以在应用程序级别处理它。