Rails, 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

В моем файле 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).

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


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


Ответы (1)


Ошибка NoMethodError

undefined method `id' for nil:NilClass

Как говорится в сообщении об ошибке, Rails пытается вызвать current_user по nil: NilClass, что подразумевает, что ваш объект id равен нулю.

Итак, вы должны сделать current_user

@current_user
person Kaleem Ullah    schedule 31.08.2015