Rails 4 を使用して Web アプリを作成しています。
CanCanCan を使用して、さまざまな役割の能力を定義しようとしています。
User モデルと Profile モデルがあります。各ユーザーは、多数のプロファイルを持つことができます。各プロファイルは、異なる役割を持つことができます。
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
私の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>
能力を定義しようとする前は、これはエラーを引き起こしませんでした。また、プロジェクトのインデックスで返されたプロジェクトのいくつかは、私の能力.rb で指定した基準を満たしていないプロジェクトです (たとえば、Disclosure.allusers が true に設定されていません)。
この能力を上記のように定義する際に、私が何を間違っていたかわかる人はいますか?
これは、同じタイトルの関連する質問で述べた問題とは異なります。