Функция входа / регистрации не работает, @current_user не работает, сеансы не работают - PullRequest
0 голосов
/ 04 января 2019

Я новичок в Rails и работаю над практическим приложением, которое включает в себя простую функцию входа в систему.Я следовал учебнику из CodeAcademy по книгам, однако код не работает во многих отношениях.Прежде всего, сеансы не устанавливаются, хотя Rails выполняет остальную часть кода внутри блока «if», используемого совместно с объявлением сеанса (кстати, ошибок не возвращается).

Контроллер сеанса:

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 

Экстраполируя эту проблему, моя функция "current_user" не работает, что, скорее всего, потому, что сеанс не устанавливается.

Контроллер приложения:

class ApplicationController < ActionController::Base
def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end

Любая помощь очень ценится.Дайте мне знать, если вам нужно что-то еще увидеть.

ПРИМЕЧАНИЕ: я знаю, что должен использовать Devise, и я планирую в будущем делать более серьезные проекты.Однако, как я уже сказал, это приложение для практики / тестирования, помогающее развить мои навыки кодирования, и прежде чем использовать «магический» драгоценный камень, такой как Devise, я хочу получить практический опыт создания собственной системы входа в систему.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Есть несколько возможных проблем.

Во-первых, @current_user не устанавливается, пока не будет вызван метод current_user.И, как указал @Neha, вам нужно добавить вспомогательный метод в ApplicationController, чтобы все ваши представления имели доступ к методу current_user.Добавьте эту строку в свой ApplicationController:

helper_method :current_user

Теперь, чтобы диагностировать проблему, давайте настроим что-то, что позволит вам получить некоторую прозрачность в вашем сеансе и current_user.

Сначала, в views/layouts/application.html.erb, сразу после строки, которая говорит <= yield %>, добавьте:

<%= render 'layouts/footer' %>

Затем добавьте новый файл views/layouts/_footer.html.erb:

<hr/>
Session:<br/>
<% session.keys.each do |key| %>
  <%= "#{key}: #{session[key]}" %><br/>
<% end %>
<br/>
User:<br/>
<%= current_user&.username || '[None]' %>

Теперь в нижней части каждого представления вы можете видеть детали вашего сеанса.

В вашем действии sessions#create у вас есть потенциальная проблема с поиском вашего пользователя.Вы используете params[:session][:name] там, где вы, вероятно, должны использовать params[:session][:username].

Кроме того, тангенциально, правильный способ уничтожить сессию - это не установить для session[:id] значение nil, а вместо этого использовать reset_session.Так что ваш SessionsController должен выглядеть так:

class SessionsController < ApplicationController
  def new
  end

  def create
    @user = User.find_by_username(params[:session][:username])
    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
    reset_session
    redirect_to login_path
  end
end
0 голосов
/ 04 января 2019

Я думаю, что ошибка в том, что session_controller не может найти current_user.

Введите следующий код в application_controller:

class ApplicationController < ActionController::Base

   helper_method :current_user

   def current_user
     return unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
   end

   def require_user 
    redirect_to '/login' unless current_user 
   end

end

Позвольте мне узнать, работает ли он

...