任务:在登录后立即显示员工的个人资料。
问题:
class WelcomeController < ApplicationController
def index
@employee = Employee.find_by_email(params[@current_user.email])
end
end
我尝试以多种方式编写代码,将当前用户的电子邮件与员工表中的相应详细信息相关联,并且我能得到的最远的信息是: 我确信我在索引内的这一行写错了,但我正在研究,我发现并尝试的所有事情都没有让员工与当前用户相关。
答案 0 :(得分:1)
尝试使用此代码:
class WelcomeController < ApplicationController
def index
@employee = Employee.where(email: current_user.email).first
end
end
使用Devise时,当前用户是一个实例变量,因此您不需要在其前面添加@。
如果您要拥有大量用户,最好在数据库中为电子邮件列创建索引。
答案 1 :(得分:0)
我喜欢kjmagic13的回答。使用
@current_user.id
它从数据库中提取与用户相关的所有信息
Mori的答案也很好。答案 2 :(得分:0)
日志中的以下SQL行对应于Employee.find_by_email
调用:
SELECT "employees".* FROM "employees" WHERE "employees"."email" IS NULL LIMIT 1
正如Mori所指出的,这意味着您通过nil
电子邮件找到了员工,这意味着params[@current_user.email]
是nil
。由于您没有参数,因此无论如何都不需要引用params
哈希。您应该只参考@current_user.email
:
Employee.find_by_email @current_user.email
答案 3 :(得分:0)
正如Mori的回答所说,你可能并不打算将@ current_user.email用作params的哈希键。我认为您正在尝试通过电子邮件(而不是通过作为参数提交的电子邮件)查找当前用户的员工记录,如此(也避免弃用find_by_ *帮助程序):
@employee = Employee.find_by(email: @current_user.email)
我认为您不想尝试Employee.find(@current_user.id)
- 只是要查找其id与current_user的ID匹配的员工 - 除非员工和用户使用同样的表格没有意义
答案 4 :(得分:-1)
为什么不通过ID找到? find_by_*
已经过时了。
@employee = Employee.find(@current_user.id)