我正在开发一个平台,他们要求我集成Pundit gem。创建策略时,我意识到许多方法都具有相同的访问控制策略。 示例:
Action1: Only accessible by the administrator or owner of the resource
Action2: Only accessible by the administrator or owner of the resource
Action3: Only accessible by the administrator or owner of the resource
.
.
.
然后我考虑过以以下方式创建动态方法
[: Action1 ?,: Action2? ,: Action3?].each do |meth|
define_method(meth){@current_user.admin? or @current_user.owner_resource?}
end
但是我有一个问题: Ruby on Rails是在运行时还是在编译时执行这些方法? 创建动态方法是最佳选择还是以静态方式分别创建3个方法更好?
谢谢!
答案 0 :(得分:1)
Ruby on Rails是在运行时还是在编译时执行方法?
运行时。
方法在初次解释时将被解析,但实际代码直到运行后才会得到评估。
方法定义可以包含完整的废话(例如,未定义的变量)-但除非包含语法错误,否则在实际调用代码之前不会暴露此错误
...这纯粹是“红宝石”;无论您是否使用Rails框架,它都会发生。
创建动态方法是最佳选择还是以静态方式分别创建3个方法更好?
这取决于您所说的“最佳”的意思。
在性能方面,使用静态方法要快一些。但是,除非您要构建核心库,否则差异可以忽略不计-因此我不必为此担心。
但是,还有其他充分的理由在可能的情况下静态定义方法。即:代码不那么混乱,更容易导航到方法定义(例如,在使用IDE时),并且在元编程较少的情况下更容易更改方法定义。
我个人可能倾向于将这些方法定义为:
def action1?
user.admin? || user == record.owner
end
def action2?
action1?
end
def action3?
action1?
end
(但是不知道action
到底是什么,或者它们如何适合您的应用程序的更广泛的上下文,很难给出具体的建议。)
或者,如果您愿意,也可以使用alias
。