Rails,Devise,Role Model和CanCanCan - 定义能力

时间:2015-08-31 06:19:36

标签: ruby-on-rails cancan user-roles cancancan

我正在使用Rails 4制作网络应用。

我正在尝试使用CanCanCan来定义各种角色的能力。

我有用户模型和个人资料模型。每个用户可以拥有许多配置文件每个配置文件都可以有不同的角色。

在我的Profile.rb中,我已将我的角色(使用Role Model gem)定义为:

  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

在我的能力.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的布尔属性。

我也有扫描和披露的模型。协会是:

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

它引用了我的项目展示视图中的一行,其中包含:

<span class="editproject">    <% if current_user.id == @project.creator_id %>
          <%= link_to 'Edit Project', edit_project_path(@project) %> <% end %> </span>

在尝试定义能力之前,这不会导致错误。此外,在项目索引中返回的一些项目是不符合我在ability.rb中指定的标准的项目(例如,Disclosure.allusers未设置为true)。

任何人都可以看到我在定义此能力方面做错了吗?

1 个答案:

答案 0 :(得分:0)

错误是NoMethodError

undefined method `id' for nil:NilClass

正如错误所说,Rails试图在nil:NilClass上调用current_user,这意味着你的id对象为零。

所以,你应该current_user

@current_user