Есть несколько возможных проблем.
Во-первых, @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