0

我是使用ruby1.9.3 和rails4.0.2 和pundit0.2.1的新手

后模型包括:

belongs_to :user

用户模型是使用devisegem 生成的(并且没有has_many :posts

devise :database_authenticatable, :registerable,
     :rememberable, :trackable, :validatable

我做到了rake db:drop db:create db:migrate,我schema.rb现在user_idposts桌子上。

然后我跟着这个博客使用 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就像我使用cancangem 时遇到的那样)。

但是没有用户,甚至帖子的作者,都不能编辑和销毁他的帖子。

它只是显示 Couldn't find post。(这是来自的警报消息rescue_from Pundit::NotAuthorizedError

我尝试在博客文章中的方法中更改逻辑,PostPolicy owned但没有奏效。

有了这些模型和模式,我怎样才能在不使用任何 gem 的情况下实现这个简单的授权(只有帖子的作者应该能够编辑和删除他的帖子)?

我在这里尝试了其他类似的问题,但没有一个对我有用。

由于我的授权正在发挥作用,现在我正在努力专门定制viewsedit链接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获取的实例。viewcontroller

对我来说,它给了NoMethodError in Posts#indexundefined method user_id for <Class:0x22d64d8>

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

4

1 回答 1

0

感谢 Uri 编辑问题。

非常感谢安迪正确地指导我。正如您所说,user_id创建的新帖子为零。我刚刚将当前用户的 id 分配给post.user_idincreate方法

def create?
 post.user_id = user.id
 new?
end

post_policy.rb

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

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

于 2014-03-27T08:29:54.073 回答