在rails辅助模块中使用attr_reader是什么意思?

时间:2012-04-26 21:16:54

标签: ruby-on-rails ruby

module ProductsHelper
  attr_reader :products, :product    
end

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

2 个答案:

答案 0 :(得分:2)

通过在视图中调用@products@product,可以从productsproduct实例变量中读取值。您仍然需要在控制器中设置它们。

这些读者并不需要做太多帮助。

答案 1 :(得分:2)

这是一个Ruby惯例,它创建了一个名为product的“getter”和另一个名为products的产品。

例如,如果您有一个对象 ph ,它等同于ProductHelper.new。

ph = ProductHelper.new

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

def initialize
  @products = "awesomeness"
end

如果没有对模块发送信息,您将无法访问它,因为它被认为是 ph 实例的私密内容。

(如果以下内容令人困惑,请不要担心,因为它不是你作为rails的新手所看到的东西。当你进入元编程时,你会看到更多。) < / p>

ProductsHelper.send :products

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

ProductHelper.products

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

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

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

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

def products( value )
  @products = value
end

允许你这样做。

ph.products = "some awesome thing"

最后,你还有一个attr_accessor,可以在一个动作中创建一个getter和setter。