“类似的问题”是说你可以做这样的事情
class YourModel < ActiveRecord::Base
attr_accessor :current_user
# ...
end
然后在你的控制器动作中你可以做类似的事情
@your_model = YourModel.find(params[:id])
@your_model.current_user = current_user
@your_model.assign_attributes(params[:your_model])
if @your_model.valid?
# ...
然后您可以使用self.current_user
withinYourModel
的验证方法。
请注意,我认为这不是您应该做的,因为我不认为这种“验证”与“授权”一样多。未经授权的用户甚至不应该能够获得YourModel
可以保存对实例的此类更新的操作部分。
至于按要求使用 Pundit 进行授权,您将在app/policies/your_model.rb
class YourModelPolicy < Struct.new(:user, :your_model)
def update?
user.some_privilege == true # change this to suit your needs, checking the "required privileges" you mention
end
end
将 Pundit 包含在您的ApplicationController
class ApplicationController < ActionController::Base
include Pundit
# ...
end
然后,在您的控制器操作中,您可以简单地执行
def update
@your_model = YourModel.find(params[:id])
authorize @your_model
# ...
该authorize
方法将调用YourModelPolicy
'supdate?
方法(它调用与您的操作相匹配的方法 +?
默认情况下),如果返回虚假值,将导致 403 错误。