Руби: Почему третье условное утверждение не будет правдой? - PullRequest
0 голосов
/ 13 июня 2018

Может кто-нибудь помочь мне здесь.С условным утверждением ниже, только первое и второе условия когда-либо выполняются, третье (второе утверждение 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

1 Ответ

0 голосов
/ 13 июня 2018

Последнее условие будет выполнено только тогда, когда мы не сможем найти стилиста, клиента или администратора.Дело в том, что проблема связана с кодировками. Предположим, ваш идентификатор администратора равен 1, а 1 - также идентификатор клиента, который играет роль def_client. Поэтому при входе администратора мы проверяем наличие идентификатора 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

Обновление: вы можете еще больше сократить количество запросов, изменив свой код.Имейте в виду, что наличие запускает запрос, затем вы проверяете роли, которые снова создают запрос в Stylist, клиенте или администраторе, а затем мы получаем запрос find, который мы можем уменьшить, изменив код на что-то вроде ниже.

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
...