Ruby: 为什么第三个条件语句不为真?
Ruby: Why won't the third conditional statement be true?
有人可以帮我解决这个问题吗?使用下面的条件语句,只会满足第一个和第二个条件,永远不会满足第三个(第二个 elsif 语句)和最后一个条件。我试过移动用例语句,但我得到了相同的结果。
def current_user
if Stylist.exists?(session[:user_id]) && Stylist.find(session[:user_id]).has_role?(:def_stylist)
@current_user = Stylist.find(session[:user_id])
elsif Client.exists?(session[:user_id]) && Client.find(session[:user_id]).has_role?(:def_client)
@current_user = Client.find(session[:user_id])
elsif Admin.exists?(session[:user_id]) && Admin.find(session[:user_id]).has_role?(:def_admin)
@current_user = Admin.find(session[:user_id])
else
@current_user = nil
end
end
只有当我们找不到造型师、客户或管理员时才会满足最后一个条件。
我认为问题出在条件上,假设您的管理员用户 ID 是 1,而 1 也是具有 def_client 角色的客户端 ID,
因此,当管理员登录时,我们检查 id 1 是否存在于 Client
table 中并找到客户端。您应该为不同的角色设置不同的会话。
我认为在更改会话密钥后这将起作用。
def current_user
@current_user =
if session[:stylist_user_id] && Stylist.find(session[:stylist_user_id]).has_role?(:def_stylist)
Stylist.find(session[:stylist_user_id])
elsif Client.exists?(session[:client_user_id]) && Client.find(session[:client_user_id]).has_role?(:def_client)
Client.find(session[:client_user_id])
elsif Admin.exists?(session[:admin_user_id]) && Admin.find(session[:admin_user_id]).has_role?(:def_admin)
Admin.find(session[:admin_user_id])
end
end
更新:您可以通过更改代码进一步减少查询。请记住,exist 会触发一个查询,然后您检查角色,这会再次在 Stylist、client 或 admin 上创建一个查询,然后我们会找到可以通过将代码更改为如下所示的查询来减少的查询。
def current_user
@current_user =
if session[:stylist_user_id]
stylist = Stylist.find(session[:stylist_user_id])
stylist if stylist.has_role?(:def_stylist)
elsif session[:client_user_id]
client = Client.find(session[:client_user_id])
client if client.has_role?(:def_client)
elsif session[:admin_user_id]
admin = Admin.find(session[:admin_user_id])
admin if admin.has_role?(:def_admin)
end
end
有人可以帮我解决这个问题吗?使用下面的条件语句,只会满足第一个和第二个条件,永远不会满足第三个(第二个 elsif 语句)和最后一个条件。我试过移动用例语句,但我得到了相同的结果。
def current_user
if Stylist.exists?(session[:user_id]) && Stylist.find(session[:user_id]).has_role?(:def_stylist)
@current_user = Stylist.find(session[:user_id])
elsif Client.exists?(session[:user_id]) && Client.find(session[:user_id]).has_role?(:def_client)
@current_user = Client.find(session[:user_id])
elsif Admin.exists?(session[:user_id]) && Admin.find(session[:user_id]).has_role?(:def_admin)
@current_user = Admin.find(session[:user_id])
else
@current_user = nil
end
end
只有当我们找不到造型师、客户或管理员时才会满足最后一个条件。
我认为问题出在条件上,假设您的管理员用户 ID 是 1,而 1 也是具有 def_client 角色的客户端 ID,
因此,当管理员登录时,我们检查 id 1 是否存在于 Client
table 中并找到客户端。您应该为不同的角色设置不同的会话。
我认为在更改会话密钥后这将起作用。
def current_user
@current_user =
if session[:stylist_user_id] && Stylist.find(session[:stylist_user_id]).has_role?(:def_stylist)
Stylist.find(session[:stylist_user_id])
elsif Client.exists?(session[:client_user_id]) && Client.find(session[:client_user_id]).has_role?(:def_client)
Client.find(session[:client_user_id])
elsif Admin.exists?(session[:admin_user_id]) && Admin.find(session[:admin_user_id]).has_role?(:def_admin)
Admin.find(session[:admin_user_id])
end
end
更新:您可以通过更改代码进一步减少查询。请记住,exist 会触发一个查询,然后您检查角色,这会再次在 Stylist、client 或 admin 上创建一个查询,然后我们会找到可以通过将代码更改为如下所示的查询来减少的查询。
def current_user
@current_user =
if session[:stylist_user_id]
stylist = Stylist.find(session[:stylist_user_id])
stylist if stylist.has_role?(:def_stylist)
elsif session[:client_user_id]
client = Client.find(session[:client_user_id])
client if client.has_role?(:def_client)
elsif session[:admin_user_id]
admin = Admin.find(session[:admin_user_id])
admin if admin.has_role?(:def_admin)
end
end