2

我收到以下语法错误:

(eval):1: syntax error, unexpected $undefined
$#<MenuBuilder:0x007fccee84e7f8> = #<MENUBUILDER:0X007FCCEE84E7F8>
 ^

这是代码执行:

_main_menu.html.haml

#main-menu 
  = menu do |m| 
    = m.submenu "Products" do 
      = m.item "Products", Product 

builders_helper.rb

module BuildersHelper 
  def menu(options = {}, &block) 
    MenuBuilder.new(self).root(options, &block) 
  end 
end 

menu_builder.rb

class MenuBuilder 
  attr_accessor :template 
  def initialize(template) 
    @template = template 
  end 
  def root(options, &block) 
    options[:class] = "jd_menu jd_menu_slate ui-corner-all" 
    content_tag :ul, capture(self, &block), options 
  end 
  def item(title, url, options = {}) 
    content_tag :li, options do 
      url = ajax_route(url) unless String === url 
      url = dash_path + url if url.starts_with?("#") 
      link_to title, url 
    end 
  end 
  def submenu(title, options = {}, &block) 
    content_tag :li do 
      content_tag(:h6, title.t) + 
      content_tag(:ul, capture(self, &block), :class => "ui-corner- 
all") 
    end 
  end 
end 

它在 root 方法中的 capture() 调用上失败:

content_tag :ul, capture(self, &block), options

self 指的是 MenuBuilder 的实例,我很肯定一个块作为另一个参数传递。如果我在 if block_given 中抛出 puts 语句?它会执行,但不会通过上面的 content_tag 行。

4

2 回答 2

0

问题似乎在于您使用capturehelper method

该方法接受视图代码块并将其分配给可在视图中其他地方使用的变量。

这里有更多信息:http ://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-capture

您确定您实际上是在将一个块传递到执行捕获的代码中吗?

你可能会考虑这样的事情:

content_tag :li do 
  if block_given?
    content_tag(:h6, title.t) + 
    content_tag(:ul, capture(self, &block), :class => "ui-corner-all") 
  else
    content_tag(:h6, title.t) # whatever is appropriate if there's no block passed
  end
end 
于 2012-05-09T21:51:29.940 回答
0

好的,我刚遇到这个问题,我想我想出了如何解决它。问题很可能是引入到 ActiveRecord 中的错误,它们覆盖了 Kernel.capture。我发现解决方法是使用辅助模块的捕获而不是类级别的捕获。因此,在您正在调用的情况下,请content_tag :ul, capture(self, &block), options尝试调用,content_tag :ul, @template.capture(self, &block), options以便使用辅助模块的捕获方法而不是 AR 中的伪劣方法。

查看这些 github 问题以获取更多信息。

于 2013-12-17T22:05:21.197 回答