2

我有一个 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

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

谢谢你。

4

2 回答 2

4

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

NotePolicy#new?--> ApplicationPolicy#new?-->NotePolicy#create?

新的 Note ( @note = Note.new) 不会通过在 中进行的授权检查NotePolicy#create?

添加一个new?方法来NotePolicy实现您想要的授权逻辑。

添加

create?方法不会通过新注释 ( Note.new)。

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

要确认为什么会这样,您可以通过puts "#{user.present?} #{record.user} #{user}"在方法开头添加一行来进行调试create?

您将在服务器输出或logs/development.log.

于 2014-10-14T14:16:55.607 回答
1

它是否缺少new?NotePolicy 中的方法?

于 2014-10-14T07:47:20.520 回答