【问题标题】:Ruby: Why won't the third conditional statement be true?Ruby:为什么第三个条件语句不成立?
【发布时间】:2018-06-13 06:21:01
【问题描述】:

有人可以帮我吗?使用下面的条件语句,只满足第一个和第二个条件,第三个(第二个 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

【问题讨论】:

  • 您确定在数据库中设置了Admin 角色:def_admin 用户吗?
  • 是的。当管理员用户注册时,他们将获得角色。我还使用 has_role 在控制台上进行了检查? :def_admin.
  • 是的。当管理员用户注册时,他们将获得角色。我还使用 has_role 在控制台上进行了检查? :def_admin.
  • 为什么你的角色名称有def_ 前缀?

标签: ruby if-statement ruby-on-rails-4 conditional


【解决方案1】:

仅当我们无法找到造型师、客户或管理员时,才会满足最后一个条件。 我觉得问题出在代码上,假设您的管理员用户 ID 是 1,而 1 也是具有 def_client 角色的客户端 ID, 因此,当管理员登录时,我们检查 id 1 是否存在于Client 表中并找到客户端。您应该为不同的角色设置不同的会话。 我认为在更改会话密钥后这将起作用。

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

更新:您可以通过更改代码进一步减少查询。请记住,存在会触发查询,然后您检查角色,该角色再次在造型师、客户或管理员上创建查询,然后我们找到可以通过将代码更改为类似以下内容来减少的查询。

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

【讨论】:

  • 有道理。非常感谢
  • @MbasaDinga 如果答案让您满意而不是接受它,以便其他人可以从接受的答案中获得帮助。
  • 您的回答有效。谢谢。是一个按钮来接受你的答案吗?在这方面我还是个菜鸟。 @Manishh
  • 您会在上下箭头附近看到一个勾号。当您将其悬停时,它将显示单击以接受此答案。
猜你喜欢
  • 2019-04-08
  • 2015-04-22
  • 2019-03-05
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多