无法通过Pundit gem完成新的控制器操作

时间:2014-10-14 01:25:07

标签: ruby-on-rails pundit

我有一个Ruby on Rails网络应用程序,用户可以在其中创建笔记。该笔记属于创建它的用户。

我安装了Pundit gem来创建授权,特别是管理员角色。

我希望用户能够:

  • 创建,更新或删除他们的备注

管理员可以为任何用户的笔记执行相同操作。

当我以管理员身份登录时,我可以创建一个新笔记。当我以会员身份登录时,我无法创建新笔记。我立即被重定向到根页面,甚至从未进入新的笔记页面。

以下是我收到的Flash错误消息:

not allowed to new? this #<Note:0x007fe2ca17bc18>

在安装Pundit之前,成员能够创建新笔记。所以我认为它与我的政策有关。

以下是我application_policy.rb文件中的相关方法:

  def index?
    false
  end

  def show?
    scope.where(:id => record.id).exists?
  end

  def create?
    user.present?
  end

  def new?
    create?
  end

  def update?
    user.present? && (record.user == user || user.admin?)
  end

  def edit?
    update?
  end

  def destroy?
    update?
  end

这是我的note_policy.rb文件:

class NotePolicy < ApplicationPolicy

  def create?
    user.present? && (record.user == user || user.admin?)
  end

  def new?
    create?
  end

  def update?
    create?
  end

  def destroy?
    update?
  end

end

以下是我notes_controller.rb文件中的相关操作:

  def new
    @note = Note.new
    authorize @note
  end

  def create
    @note = Note.new(notes_params)
    @note.user = current_user
    authorize @note
    if @note.save
      redirect_to notes_path
    else
      render :new
    end
  end

我想弄清楚为什么管理员可以创建新笔记,但成员不能。

谢谢。

2 个答案:

答案 0 :(得分:4)

new操作中,正在使用NotePolicy#create?进行授权检查。请参阅以下链接:

NotePolicy#new? - &gt; ApplicationPolicy#new? - &gt; NotePolicy#create?

新笔记(@note = Note.new)未通过NotePolicy#create?中的授权检查。

new?添加NotePolicy方法,以实现您想要的授权逻辑。

<强> ADDED

create?方法不会传递新便笺(Note.new)。

def create?
  user.present? && (record.user == user || user.admin?)
end

要确认原因,您可以通过在puts "#{user.present?} #{record.user} #{user}"方法的开头添加create?之类的行来进行调试。

您将在服务器输出或logs/development.log中看到这些变量的值。

答案 1 :(得分:1)

在NotePolicy中缺少new?方法吗?