【问题标题】:Ruby loads the methods at run time or compile?Ruby 在运行时加载方法还是编译?
【发布时间】:2018-08-13 19:38:20
【问题描述】:

我正在开发一个平台,他们要求我集成 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 个方法更好?

谢谢!!!

【问题讨论】:

    标签: ruby-on-rails ruby compilation execution pundit


    【解决方案1】:

    Ruby on Rails 是在运行时还是在编译时执行方法?

    运行时。

    方法将在第一次解释时被解析,但实际代码在运行之前不会被评估。

    方法定义可能包含完全的废话(例如未定义的变量) - 但除非它包含语法错误,否则在实际调用代码之前不会暴露.

    ...这纯粹是一个“红宝石”的东西;无论您是否使用 rails 框架,它都会发生。

    创建动态方法是最佳还是以静态方式分别创建 3 个方法更好?

    这取决于您所说的“最佳”。

    在性能方面,静态方法稍微快一些。但除非您正在构建核心库,否则差异可以忽略不计 - 所以我不会担心。

    但是,如果可能的话,还有其他充分的理由来静态定义方法。即:代码不那么混乱,更容易导航到方法定义(例如在使用 IDE 时),并且在元编程较少时更容易更改方法定义。

    就个人而言,我可能倾向于将这些方法定义为:

    def action1?
      user.admin? || user == record.owner
    end
    
    def action2?
      action1?
    end
    
    def action3?
      action1?
    end
    

    (但不知道actions 究竟是什么,或者它们如何适应您的应用程序的更广泛的上下文,很难给出具体的建议。)

    或者,如果您愿意,也可以使用alias

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 2012-06-26
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多