在屏幕投射中从 Rails 应用程序导出 CSV http://railscasts.com/episodes/362-exporting-csv-and-excel,Ryan Bates 给出了以下简单的代码。
我试图弄清楚类方法 Product::to_csv 实际上是如何在 ProductController.rb 的第 5 行被调用的,因为它似乎不遵循正常的 Ruby 规则。
产品.rb
1 class Product < ActiveRecord::Base
2 def self.to_csv(options = {})
3 ...
4 end
5 end
产品控制器.rb
1 class ProductsController < ApplicationController
2 def index
3 @products = Product.order(:name)
4 respond_to do |format|
5 format.csv { send_data @products.to_csv }
6 ...
7 end
8 end
9 end
由于 to_csv 是一个类方法,我希望调用看起来像 Product::to_csv() 。
根据文档,@products 是 ActiveRecord::Relation 的一个实例。为什么发送到 ActiveRecord::Relation 实例的消息会导致调用 Product 类对象上的方法?更奇怪的是,在发送者和接收者中将 to_csv 重命名为某个任意名称会导致 NoMethodError,所以也许有一些基于以 to_ 开头的名称的魔法正在发生?
我错过了一些明显的东西吗?任何澄清将不胜感激。
这只是 Rails 所做的事情之一。任何类方法都会自动成为“集合”方法,这意味着它们可用于关系对象。这样,作用域和类方法是可以互换的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)