Railstutorial ActionController :: InvalidAuthenticityToken в SessionsController # destroy, не может выйти из системы - PullRequest
0 голосов
/ 14 апреля 2019

Как указано на Railstutorial.org, я создаю функцию аутентификации с нуля (в отличие от использования гема). Я пытаюсь разрешить пользователю выйти из системы. Который в соответствии с разделом 9.1.3 должен быть довольно простым. Но есть кое-что, что я пропускаю. Я перечитал книгу несколько раз, чтобы попытаться определить свою ошибку и, конечно же, попробовал предложения здесь по stackoverflow.

Вот несколько советов, которые я пробовал

добавление мета-тега csrf

ActionController :: InvalidAuthenticityToken в SessionsController # destroy

замена 'session.delete (: user_id)' на 'reset_session'

NoMethodError в SessionsController # destroy

Я сравнил свой код с файлом github другого «студента»

https://github.com/becky000/sample_app/tree/master/app

И не смог заметить существенных отличий, кроме версии ruby ​​и rails, которую я использую. ruby '2.5.3' и 'rails', '~> 5.2.3'.

При попытке выйти из системы я получаю

ActionController :: InvalidAuthenticityToken в SessionsController # destroy

Параметры:

{ "_ метод" => "Удалить"}

Полагаю, это означает, что с моим методом уничтожения что-то не так. Но, насколько я могу судить, я следую инструкциям к T.

app/controllers/sessions_controller.rb



class SessionsController < ApplicationController

  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])
      log_in @user
      params[:session][:remember_me] == '1' ? remember(@user) : 

  forget(@user)
      redirect_back_or @user
    else
      # Create an error message.
      flash.now[:danger] = 'not relevant'
      render 'new'
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end


app/helpers/sessions_helper.rb



  module SessionsHelper

  def log_in(user)
    session[:user_id] = user.id
  end

  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  def current_user?(user)
    user == current_user
  end

  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

  def logged_in?
    !current_user.nil?
  end

  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end

end



app/controllers/application_controller.rb 



class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end



app/controllers/sessions_controller.rb



class SessionsController < ApplicationController

  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])
      # Log the user in and redirect to the user's show page
      log_in user
      remember user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...