2
module ProductsHelper
  attr_reader :products, :product    
end

做上面的结果是什么?我在 Rails 指南中看到了这一点,只是不明白。

4

2 回答 2

2

它将允许通过在视图中调用和从实例变量@products中读取值。您仍然需要在控制器中设置它们。@productproductsproduct

这些读者并没有真正提供太多帮助。

于 2012-04-26T22:40:29.813 回答
2

这是一个 Ruby 约定,它创建一个称为 product 的“getter”和另一个称为 products 的“getter”。

例如,如果您有一个相当于 ProductHelper.new的对象ph 。

ph = ProductHelper.new

在该模块中存在一个实例变量。

def initialize
  @products = "awesomeness"
end

如果不对模块进行发送,您将无法访问它,因为它会被视为该ph实例的私有。

(如果以下内容令人困惑,请不要担心,因为作为 Rails 新手,您不会看到太多。当您进入元编程时,您会看到更多。)

ProductsHelper.send :products

但是 attr_reader 将允许您读取方法或变量,就好像它是实例的属性一样。

ProductHelper.products

它基本上为您完成了这段代码。

def products
  @products # which is an instance variable within the instantiated object.
end

尽管您通常只会在模型类中看到这些,而不是在 Modules 中……因为 Ruby 中的所有类都是模块,但这种行为也存在于该级别。如果您没有任何方法,那么将返回信息,然后调用 .products 只会返回 nil。

在 Ruby 中,也有 attr_writers 创建“setter”。

def products( value )
  @products = value
end

这允许你这样做。

ph.products = "some awesome thing"

最后,您还拥有 attr_accessor,它在一个操作中创建了 getter 和 setter。

于 2012-04-27T02:44:01.987 回答