我正在切换到 Devise 但无法查看我的用户索引页面或单个用户



我正在将我的UAM切换到Devise和Rolify,在查看用户索引和用户展示页面时遇到了障碍。

在rails控制台中,我可以通过User.first.email查看用户的电子邮件,所以我不确定为什么会出现关于Nil类的错误。

我可以毫无问题地登录和注销。

在SOF的一些帖子中,我看到nil类指向当前用户为nil,但在current_user周围的导航菜单中内置了一些逻辑,所以我知道这也很有效。

在Rails错误消息的屏幕截图中,它指示params为1,它应该与我当前登录的用户相对应。

有什么想法吗?我能俯瞰什么?

以下是完整的跟踪:

14:55:04 web.1  | Completed 500 Internal Server Error in 38ms (ActiveRecord: 12.7ms | Allocations: 13119)
14:55:04 web.1  |
14:55:04 web.1  |
14:55:04 web.1  |
14:55:04 web.1  | ActionView::Template::Error (undefined method `email' for nil:NilClass):
14:55:04 web.1  |     1: <div class="container">
14:55:04 web.1  |     2:   <h2>Showing User Details</h1>
14:55:04 web.1  |     3:
14:55:04 web.1  |     4:    <%= image_tag avatar_url(@user), class: "img-circle avatar_large" %>
14:55:04 web.1  |     5:
14:55:04 web.1  |     6:   <div>
14:55:04 web.1  |     7:     <%= link_to "Edit your profile", edit_user_path(@user) %>
14:55:04 web.1  |
14:55:04 web.1  | app/helpers/application_helper.rb:3:in `avatar_url'
14:55:04 web.1  | app/views/users/show.html.erb:4

轨道错误台屏幕截图

PG 中用户数据库的屏幕截图

这是我的用户控制器:

# frozen_string_literal: true
class UsersController < ApplicationController
before_action :authenticate_user!, only: %i[show edit update destroy]
before_action :require_user, only: %i[edit update]
before_action :require_same_user, only: %i[edit update destroy]
def show
@events = @user.events
@events = @user.artists
end
def new
@user = User.new
end
def index
@users = User.all
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
flash[:notice] = "Welcome to the site #{@user.username}, you have successfully signed up"
redirect_to user_path(@user)
else
render "new"
end
end
def destroy
@user.destroy
session[:user_id] = nil if @user == current_user
flash[:notice] = "Account and all associated events successfully deleted"
redirect_to root_path
end
def edit; end
def update
if @user.update(user_params)
flash[:notice] = "Your account information was successfully updated"
redirect_to @user
else
render "edit"
end
end
private
def user_params
params.require(:user).permit(:email, :password)
end
def set_user
@user = User.find(params[:id])
end
def require_same_user
if current_user != @user && !current_user.admin?
flash[:alert] = "You can only edit or delete your own account"
redirect_to login_path
end
end
end

这是我的用户模型:

class User < ApplicationRecord
has_many :events, dependent: :destroy
has_many :artists, dependent: :destroy
rolify
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
end

您的app/views/users/show.html.erb正在users_controller中查找@user变量,您尚未在相应的show方法中定义该变量。

因此,您可以获取current_user或params:中的id

def show
@user = current_user
# OR
@user = User.find(params[:id])
end

取决于设置和用例。。。

编辑:还值得一提的是,您确实有一个不使用的set_user方法:before_action :set_user, only: %i[show edit update destroy]

我认为您需要使用set_user方法。

class UsersController < ApplicationController
before_action :set_user, only: %i[show edit update destroy]
end

但我建议在show方法中使用current_user

您在控制器中定义了一个set_user方法,它设置了@user变量,但您没有调用该方法。

通常这将在before_action 中完成

class UsersController < ApplicationController
before_action :set_user, only: [:show, :update, :destroy]
...

相关内容

最新更新