Я использую Rails 4 для создания веб-приложения.
Я пытаюсь использовать CanCanCan для определения способностей для различных ролей.
У меня есть модель пользователя и модель профиля. У каждого пользователя может быть много профилей. У каждого профиля может быть своя роль.
В моем Profile.rb я определил свои роли (используя гем Role Model) как:
include RoleModel
roles :admin, :manager, # coalfacer
:student, :educator, :researcher, :ktp, :faculty_manager, :ip_asset_manager, # for universities
:sponsor, # for industry
:project_manager, :representative, # for both uni and industry
:grantor, :investor, :adviser, :innovation_consultant, :panel_member, # external
:participant, :guest # public
roles_attribute :roles_mask
В моем файле capacity.rb я пытаюсь определить первую способность как:
user ||= User.new # guest user (not logged in)
#users who are not signed in can read publicly available projects
can :read, Project, {:active => true, :closed => false, && Project.sweep.disclosure.allusers: true}
В моей таблице проектов у меня есть логический атрибут: closed.
У меня также есть модели для Sweep и Disclosure. К ассоциациям относятся:
Project.rb:
has_one :sweep
accepts_nested_attributes_for :sweep
Sweep. rb
belongs_to :project
has_one :disclosure
accepts_nested_attributes_for :disclosure
Disclosure.rb
belongs_to :sweep
В моей таблице раскрытия информации есть логический атрибут: allusers.
Если Projects.closed - false И project.sweep.disclosure.allusers - true, то я хочу разрешить гостям читать проект.
Когда я пытаюсь сделать так, как изложено выше, я получаю сообщение об ошибке:
undefined method `id' for nil:NilClass
Это относится к строке в моем представлении Project show, в которой говорится:
<span class="editproject"> <% if current_user.id == @project.creator_id %>
<%= link_to 'Edit Project', edit_project_path(@project) %> <% end %> </span>
До попытки определения способностей это не вызывало ошибки. Кроме того, некоторые из проектов, возвращенных в индекс проектов, являются проектами, которые не соответствуют критериям, указанным в моем файле capacity.rb (например, Disclosure.allusers не установлен как true).
Может ли кто-нибудь увидеть, что я сделал не так, определив эту способность, как указано выше?