0

我有这样的事情:

@menus = { Yay: '/', Yay2: '/yay2' }

@menus.each do |title, link|
  get link do
    erb title.downcase
  end
end

def foo
  'test' + @menus.join(', ')
end

yay.erb 或 yay2.erb 包含:

<%= foo %>

它显示方法@menusinfoo是一个nil对象的错误,因为在get linkproc 中声明,如何克服这个问题?

4

2 回答 2

3

问题是@menus类有一个实例变量,而在方法中它指的是实例的一个实例变量——这是不同的。

@menus创建一个局部变量,以便将其关闭,然后使用而define_method不是def这样您的方法定义是一个闭包并且menus可以从中访问:

menus = { Yay: '/', Yay2: '/yay2' }

menus.each do |title,link|
  get link do
    erb title.downcase
  end
end

define_method :foo do
  'test' + menus.join(', ')
end
于 2013-08-11T18:26:56.393 回答
0

1) 哈希没有 join() 方法。

2) 显然您发布的代码在一个类中,因此另一种解决方案是为您创建的名为@menus 的类实例变量提供一个访问器方法,然后您可以编写self.class.menus 而不是编写@menus:

class SomeClass
  #Inside here and outside of any def's self=SomeClass

  class <<self           #Open the class's singleton class
    attr_reader :menus
  end

  @menus = { Yay: '/', Yay2: '/yay2' }  #@menus attaches to self, which is SomeClass

  @menus.each do |title, link|  #@menus is retrieved from whatever object self is, which is SomeClass
    puts title, link
  end

  def foo
     #Inside here self=the instance of SomeClass that called this method, 
     #so @menus will be retrieved from that instance--not SomeClass
    'test ' + self.class.menus.keys.join(', ')
  end

end

实例变量,即那些以@ 开头的变量,将它们自己附加到任何self 上,或者从任何self 中检索到。

于 2013-08-11T19:00:43.020 回答