Rails、Devise、Role Model 和 CanCanCan - 定义能力
Rails, Devise, Role Model and CanCanCan - defining abilities
我正在使用 Rails 4 制作网络应用程序。
我正在尝试使用 CanCanCan 来定义各种角色的能力。
我有一个用户模型和一个配置文件模型。每个用户可以有多个配置文件。每个配置文件可以有不同的角色。
在我的 Profile.rb 中,我将我的角色(使用角色模型 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
在我的 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}
在我的项目 table 中,我有一个名为 :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
我的披露 table 有一个名为 :allusers 的布尔属性。
如果 Projects.closed 为假且 project.sweep.disclosure.allusers 为真,那么我想让来宾阅读该项目。
当我按照上面的设置尝试时,我收到一条错误消息:
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)。
谁能看出我在上面定义此能力时做错了什么?
错误是NoMethodError
undefined method `id' for nil:NilClass
如错误所述,Rails 正试图在 nil:NilClass 上调用 current_user,这意味着您的 id
对象为 nil。
所以,你应该 current_user
@current_user
我正在使用 Rails 4 制作网络应用程序。
我正在尝试使用 CanCanCan 来定义各种角色的能力。
我有一个用户模型和一个配置文件模型。每个用户可以有多个配置文件。每个配置文件可以有不同的角色。
在我的 Profile.rb 中,我将我的角色(使用角色模型 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
在我的 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}
在我的项目 table 中,我有一个名为 :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
我的披露 table 有一个名为 :allusers 的布尔属性。
如果 Projects.closed 为假且 project.sweep.disclosure.allusers 为真,那么我想让来宾阅读该项目。
当我按照上面的设置尝试时,我收到一条错误消息:
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)。
谁能看出我在上面定义此能力时做错了什么?
错误是NoMethodError
undefined method `id' for nil:NilClass
如错误所述,Rails 正试图在 nil:NilClass 上调用 current_user,这意味着您的 id
对象为 nil。
所以,你应该 current_user
@current_user