首页 > 解决方案 > 如何在不使用 Javascript 的情况下在 Rails 中制作注销按钮?

问题描述

我在不使用任何 Javascript 的情况下创建 Rails 应用程序,我想知道如何实现注销按钮以将会话设置为“nil”。大多数教程建议使用“method::delete”,但这需要使用 JavaScript。

会话控制器:

class SessionsController < ApplicationController
  def new

  end

  def create
    user = User.find_by_username(params[:session][:name])
    if user && user.authenticate(params[:session][:password])
      session[:user_id] = user.id
      redirect_to '/posts'
    else
      session[:user_id] = nil
      flash[:warning] = "Failed login- try again"
      redirect_to '/login'
    end 
  end

  def destroy
    session[:session_id] = nil 
    redirect_to login_path 
  end
end

标签: javascriptruby-on-railsruby

解决方案


您可以使用button_to而不是link_to.

<%= button_to logout_path, method: :destroy %>

button_to实际上创建了一个离散<form>元素,因此即使没有 javascript 也能正常工作。method: :destroy添加一个隐藏的输入,由Rack::MethodOverride.

注销用户时,您应该重置会话,而不仅仅是从会话存储中删除用户 ID。

def destroy
  reset_session
  redirect_to login_path 
end

这会使整个会话存储 cookie 无效并防止会话固定。更好的是,首先不要重新发明身份验证轮。


推荐阅读