我有一个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
我想弄清楚为什么管理员可以创建新笔记,但成员不能。
谢谢。
答案 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?
方法吗?