使用gem pundit,为什么帖子的作者无法在Ruby on Rails 4.0.2中编辑或删除它?

时间:2014-03-26 13:23:40

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems pundit

我是使用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.erbpost_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上的专家文档,我们可以在policyview中通过controller方法获取NoMethodError in Posts#index的实例。< / p>

对我而言,它会undefined method user_id for <Class:0x22d64d8>和{{1}}

我在帖子中有user_id字段。 我想我需要传递带有获取user_id的策略的@post。 我尝试了其他方法但没有成功。

1 个答案:

答案 0 :(得分:0)

感谢Uri编辑问题。

感谢Andy为我提供了正确的指导。正如你所说,user_id对于创建的新帖子来说是零。我刚刚在post.user_id方法

中将当前用户的ID分配给create
def create?
 post.user_id = user.id
 new?
end

post_policy.rb

我的所有现在都正常工作。

但现在我正在努力使用用于自定义视图的策略方法。我已经相应地编辑了问题以及代码。