我有一个授权模块,我为了授权用户操作而构建。一切都很好,除非现在我想跳过请求该页面的用户是当前用户的操作。资源嵌套在user
之下,因此传递:user_id
作为参数的一部分。
根据我能够找到的,最简单的方法是使用lambda,但是看起来我没有访问过滤前的传递参数。< / p>
这是我的控制器
class Certifications::FitnessController < ApplicationController
prepend_before_action :authenticate_user!
before_action :authorize, unless: -> { params[:user_id] == current_user.id }
end
问题是永远不会调用:authorize
before_action,因此允许所有操作(我假设因为except语句总是评估为true),但是我无法检查发生了什么,因为如果我在那里停止执行,似乎没有参数(我认为应该使它总是评估为假,不是真的)。
如果有人能告诉我我做错了什么或者更好的实施方式,我真的很感激。
编辑:如果将params转换为与current_user.id相匹配的整数,则上面的代码实际上有效
before_action :authorize, unless: -> { params[:user_id].to_i == current_user.id }
答案 0 :(得分:1)
before_action do |controller|
unless params[:user_id].to_i == current_user.id
controller.authorize
end
end
或者你可以这样做: -
before_action :authorize
def authorize
unless params[:user_id].to_i == current_user.id
#do your stuff..
end
end
第二选择
before_action :authorize, unless: -> { params[:user_id].to_i == current_user.id }