我是使用ruby
1.9.3 和rails
4.0.2 和pundit
0.2.1的新手
后模型包括:
belongs_to :user
用户模型是使用devise
gem 生成的(并且没有has_many :posts
)
devise :database_authenticatable, :registerable,
:rememberable, :trackable, :validatable
我做到了rake db:drop db:create db:migrate
,我schema.rb
现在user_id
在posts
桌子上。
然后我跟着这个博客使用 gempundit
我的代码与该博客中显示的代码完全相同。此外,我将此添加到我的后控制器操作中:
def create
@post = Post.new(params[:post].permit(:title, :text))
authorize @post
if @post.save
redirect_to @post
else
render 'new'
end
end
def edit
@post = Post.find(params[:id])
authorize @post
end
def update
@post = Post.find(params[:id])
authorize @post
if @post.update(params[:post].permit(:title, :text))
redirect_to @post
else
render 'edit'
end
end
def destroy
@post = Post.find(params[:id])
authorize @post
@post.destroy
redirect_to posts_path
end
我没有收到任何错误(NoMethodError
就像我使用cancan
gem 时遇到的那样)。
但是没有用户,甚至帖子的作者,都不能编辑和销毁他的帖子。
它只是显示 Couldn't find post
。(这是来自的警报消息rescue_from
Pundit::NotAuthorizedError
)
我尝试在博客文章中的方法中更改逻辑,PostPolicy
owned
但没有奏效。
有了这些模型和模式,我怎样才能在不使用任何 gem 的情况下实现这个简单的授权(只有帖子的作者应该能够编辑和删除他的帖子)?
我在这里尝试了其他类似的问题,但没有一个对我有用。
由于我的授权正在发挥作用,现在我正在努力专门定制views
和edit
链接destroy
帖子index.html.erb
只有帖子的作者必须显示其帖子的编辑和删除链接。
我遵循elabs/pundit使用策略方法自定义视图。
这是我的代码post_policy.rb
class PostPolicy < Struct.new(:user, :post)
def owned
post.user_id == user.id
end
def create?
post.user_id = user.id
new?
end
def new?
true
end
def update?
edit?
end
def edit?
owned
end
def destroy?
owned
end
end
这是帖子中的代码index.html.erb
<% if policy(Post).edit? %>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<% end %>
<% if policy(Post).destroy? %>
<td><%= link_to 'Destroy', post_path(post), method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
根据elabs/punditpolicy
上的权威文档,它说我们可以通过 和 中的方法policy
获取的实例。view
controller
对我来说,它给了NoMethodError in Posts#index
和undefined method user_id for <Class:0x22d64d8>
我在帖子中有 user_id 字段。我想我需要通过@post 获取该user_id 的策略。我尝试了其他方法但没有成功。