Эксперт: помощник user_signed_in

Я использую Pundit для авторизации. Я хочу, чтобы профили моих пользователей были видны всем, поэтому в моем user_policy.rb у меня есть:

 def show?
    true  # Anyone can view a show
  end

В моих пользователях/show.html.erb кнопка «редактировать профиль» отображается только в том случае, если:

<% if policy(@user).update? %>
  <!--  show edit button  -->
<% end %>

Проблема в том, что когда я пытаюсь получить доступ к профилю и не вхожу в систему, Pundit ищет «пользователя»:

def update?
  record == user || user.admin == true # Only user creator can update it
end

У меня есть ошибка, говорящая, что пользователь равен нулю, поэтому администратор не определен. Я хотел сделать это:

def update?
  if user_signed_in?
    record == user || user.admin == true # Only user creator can update it
  else
    false
  end
end

но user_signed_in? является помощником по разработке, недоступным в Pundit. Есть ли эквивалент, который я мог бы использовать, или лучший способ сделать это?


person Graham Slick    schedule 10.03.2016    source источник


Ответы (2)


Не могли бы вы сначала проверить, существует ли пользовательская переменная?

def update?
  user && (record == user || user.admin == true) # Only user creator can update it
end
person RichardAE    schedule 10.03.2016

Как сказал Ричард, вы должны сначала убедиться, что есть пользователь, и является ли он владельцем или администратором. Мне нравится читать так:

  def update?
    user.present? && (is_owner? || is_admin?)
  end

private

 def is_owner?
   record.user == user
 end
 def is_admin?
   user.admin #In your case user.admin is simple enough so you don't need that, but sometimes it's not.
 end
person Yimanei    schedule 10.03.2016
comment
user.present также будет обрабатывать случай зарегистрированного, но неподтвержденного пользователя - функциональность разработки. Довольно удобно - person Jerome; 03.07.2016