如何使用 CanCanCan 从关系中获得许可?
How to get a permission from a relationship using CanCanCan?
在我的应用程序中,我有一个名为 User 的模型 has_one Talent。
在CanCanCan我有这个能力:
class Ability
include CanCan::Ability
def initialize(user)
if user.nil?
can :read, User
can :read, Talent, is_public?: true
else
can :read, Talent, is_public?: true
end
我的页面正在由 ProfilesController#show 呈现。像这样:
class ProfilesController < ApplicationController
before_action :check_ability, except: [:show]
def show
@user = User.find(params[:id])
authorize! :read, @user
authorize! :read, @user.talent
if current_user
sent_connections = current_user.sent_connections
connections = sent_connections + current_user.all_connections
@is_connected = !(connections.select { |c| c.user.id == @user.id }.empty?)
end
@top_5_photos = @user.top_5_photos
end
嗯。我正在尝试呈现该方法的配置文件:is_public returns false。但是页面呈现正确,而我预计用户由于规则无法看到页面:
can :read, Talent, is_public?: true
我在这里缺少什么?
如果我没记错的话,
can :read, Talent, is_public?: true
^ is_public?
以上预计是 Cancancan 的 属性 。
但是因为is_public?
是一个自定义方法,那么你可以试试下面的方法吗?
can :read, Talent do |talent|
talent.is_public?
end
在我的应用程序中,我有一个名为 User 的模型 has_one Talent。
在CanCanCan我有这个能力:
class Ability
include CanCan::Ability
def initialize(user)
if user.nil?
can :read, User
can :read, Talent, is_public?: true
else
can :read, Talent, is_public?: true
end
我的页面正在由 ProfilesController#show 呈现。像这样:
class ProfilesController < ApplicationController
before_action :check_ability, except: [:show]
def show
@user = User.find(params[:id])
authorize! :read, @user
authorize! :read, @user.talent
if current_user
sent_connections = current_user.sent_connections
connections = sent_connections + current_user.all_connections
@is_connected = !(connections.select { |c| c.user.id == @user.id }.empty?)
end
@top_5_photos = @user.top_5_photos
end
嗯。我正在尝试呈现该方法的配置文件:is_public returns false。但是页面呈现正确,而我预计用户由于规则无法看到页面:
can :read, Talent, is_public?: true
我在这里缺少什么?
如果我没记错的话,
can :read, Talent, is_public?: true
^ is_public?
以上预计是 Cancancan 的 属性 。
但是因为is_public?
是一个自定义方法,那么你可以试试下面的方法吗?
can :read, Talent do |talent|
talent.is_public?
end