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
将 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