2016-09-16 82 views
0

我试图创建Rails帮手,需要一个块,并遍历该生产:遍历块轨道帮手

<span data-param1="param1" data-param2="param2"> 
    <span data-options="test"> 
    <span data-options="test"> 
</span> 

在使用助手的一个例子:

<%= main(param1, param2) do %> 
<%= sub('param', :options => 'test') %> 
<%= sub('param', 'test') %> 
<% end %> 

然后助手自己:

module MyHelper 

    def main(param1, param2, &block) 
    raise ArgumentError.new('Missing block!') unless block_given? 
    content_tag :span, :data => { :param1 => param1, :picture => '' } do 
     markup = content_tag(:span, '', :data => { :param2 => param2 }).to_s 

     #loop through blocks of subs 
     &block.each do |item| 
     sub = sub(item.param, item.options) 
     data = { :param => param } 
     data[:options] = sub.options unless sub.options.blank? 
     markup << content_tag(:span, '', :data => data).to_s 
     end 

    markup 
    end 

    private 

    def sub(param, options = {}) 
    options = extract_options!(options) 
    end 

    # returns a string 
    def extract_options!(options) 
    when String 
     options 
    when Hash 
     #removed for this question 
    else 
     raise ArgumentError.new('Only Hash && String allowed!') 
    end 

end 

注:我已经删除了Hash在extract_options处理,以保持问题代码简短。

但是它不喜欢的&block环并给出了此错误:

syntax error, unexpected &, expecting keyword_end 
     &block.each do |item| 
    ^
+0

让这个无论它需要的'sub'方法构造并把它推到'标记'和'main'只是'yield'或'block.call',你现在有'&block.each'。迭代块没有意义。 – ndn

回答

1

首先,块基本上是一个Proc实例,Proc通过任何手段不确实实现Enumerable,因此它调用each在任何情况下都不会成功。

我想知道,将数组传递给main有什么问题?你想达到什么目的?

,工程的代码示例:

def main(param1, param2, *subs) 
    ... 
    subs.each ... 
end 

<%= main(param1, param2, sub('param', :options => 'test'), sub('param', 'test')) %> 

无论您仍想使用一个block(为什么?):

def main(param1, param2, &block) 
    ... 
    yield.each ... 
end 

<%= main param1, param2 do %> 
<%= [sub('param', :options => 'test'), sub('param', 'test')] %> 
<% end %> 
+0

1.将所有内容移动到一行(在答案中更新)2.不应该,但是您可能会尝试公开'sub'方法。 – mudasobwa

+0

我得到这两个例子的错误。第一个关于'* ['后面缺少']'的例子,第二个例子抱怨'sub'是未定义的方法。 – Cameron

+0

对于块示例,我现在分别为'\ n“:yield'行的字符串'获取'undefined method' ... – Cameron