我是使用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
表中有pundit
。
然后我按照blog使用了gem 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
就像我使用Couldn't find post
gem时所得到的那样。
但是没有用户,甚至不是帖子的作者,都能够编辑和销毁他的帖子。
它只显示rescue_from
。 (来自Pundit::NotAuthorizedError
PostPolicy
)
我尝试使用owned
views
方法更改逻辑,该方法在博文中有用,但它没有用。
使用这些模型和架构,如何在不使用任何宝石的情况下实现这种简单的授权(只有帖子的作者能够编辑和删除他的帖子)?
我在这里尝试了其他类似的问题,但没有一个适合我。
由于我的授权有效,现在我正在努力为帖子edit
destroy
具体index.html.erb
和post_policy.rb
个链接
只有帖子的作者必须显示编辑和删除帖子的链接。
我按照elabs/pundit使用政策方法自定义视图。
以下是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 %>
policy
根据elabs/pundit上的专家文档,我们可以在policy
和view
中通过controller
方法获取NoMethodError in Posts#index
的实例。< / p>
对我而言,它会undefined method user_id for <Class:0x22d64d8>
和{{1}}
我在帖子中有user_id字段。 我想我需要传递带有获取user_id的策略的@post。 我尝试了其他方法但没有成功。
答案 0 :(得分:0)
感谢Uri编辑问题。
感谢Andy为我提供了正确的指导。正如你所说,user_id
对于创建的新帖子来说是零。我刚刚在post.user_id
方法
create
def create?
post.user_id = user.id
new?
end
在
post_policy.rb
我的所有现在都正常工作。
但现在我正在努力使用用于自定义视图的策略方法。我已经相应地编辑了问题以及代码。