我来自使用 Python,我对 Ruby on Rails 的“魔力”如何工作感到非常困惑。
1. 任何地方都没有 require 语句
在 Python 中,为了从任何地方访问函数,您必须导入。我认为基础红宝石也是如此。但是在使用 rails 时,我可以调用隐藏在其他模块中定义的变量和函数,而无需页面顶部的任何 require 语句。
例如,我可以有这样的文件:
class CartsController < ApplicationController
....
def show
begin
@cart = Cart.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error "Attempt to access invalid cart #{params[:id]}"
redirect_to store_url, notice: 'Invalid cart'
end
end
其中logger、redirect等都没有定义。它是简单地从 ApplicationController 继承一些复杂的树,还是通过其他机制以某种方式访问这些命名空间?
2.使用不存在的方法
这是有效的 Rails 代码
current_item = line_items.find_by_product_id(product_id)
在find_by_products_id尚未在任何地方定义的地方,Rails 以某种方式动态地动态“创建”该方法。关于如何做到这一点的任何技术见解?
谢谢你的帮助!