Rails 4, Devise, Role Model и CanCanCan — определение способностей

Я использую 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

В моем Ability.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}

В моей таблице Projects у меня есть логический атрибут с именем :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 `profile' for nil:NilClass

  <% if @current_user.profile.has_role? :student %>
      <%= link_to 'Edit Project', edit_project_path(@project) %> <% end %> </span>

До попытки определения способностей это не вызывало ошибки. Кроме того, несколько проектов, возвращаемых в индексе проектов, являются проектами, которые не соответствуют критериям, указанным в моем файле Ability.rb (например, Disclosure.allusers не имеет значения true).

Может ли кто-нибудь увидеть, что я сделал неправильно в определении этой способности, как указано выше?

Это не та же проблема, которую я изложил в своем связанном вопросе с тем же заголовком.


person Mel    schedule 31.08.2015    source источник