Pundit:在嵌套资源中授权索引

Pundit: auhorize Index in nested resources

将 Rails 4.2.4 与 Devise (3.5.2) 和 Pundit (1.0.1) 结合使用。 Decent_exposure (2.3.2).

我有一个简单的 User 和 Idea 嵌套关联:

class User < ActiveRecord::Base
has_many :ideas
...

class Idea < ActiveRecord::Base
belongs_to :user
...

在routes.rb

devise_for :users

resources :users do
  resources :ideas
end

然后,如果 current_user 不是创意的所有者(在本例中,如果 current_user.id != 1),我只是试图禁止访问 users/1/ideas。 我不知道该怎么做。我可以在索引视图中仅显示 current_user 个想法:

[创意控制器]

def show
  authorize idea
end

[理念方针]

def show?
  @current_user == @idea.user
end

但是我怎样才能阻止用户简单地导航到其他用户的 Idea 索引页面? 我想在 Ideas 控制器中我应该使用类似的东西:

def index
  authorize user
end

但是然后呢?我如何向用户政策发送有关创意集合的信息? 还是我应该通过创意政策本身授权?

在此处复制 my response on GitHub,因为这样可以获得更多流量。


一种方法是创建用户拥有的存根 Idea 以进行授权。

def index
  @user = User::find(params[:user_id])
  idea  = Idea.new(user_id: @user.id)

  authorize idea

  # ...
end

index? 方法 IdeaPolicy

def index?
  record.user_id = user.id
end

另一种方法是更改​​您授权的对象。不是针对 Idea 授权,而是针对 User.

授权
def index
  @user = User::find(params[:user_id])

  authorize @user, :show_ideas?

  # ...
end

并在 UserPolicy

上创建一个新的 show_ideas? 方法
def show_ideas?
  user.id == record.id
end