【问题标题】:Create a scoped block in rails helper for additional scoped methods在 rails helper 中为其他作用域方法创建一个作用域块
【发布时间】:2011-01-05 14:22:24
【问题描述】:

我想在块助手中定义一些助手方法,但将它们保留在块的范围内,以便我可以有合理的方法名称并且看起来更干净。

假设我想使用帮助器执行以下操作(一个非常基本的示例):

<%= foo_box do |b| %>
    <%= b.title( 'Foo Bar' ) %>
    Lorem Ipsum...
<% end %>

产生类似的东西

<div class="foo_box">
   <h2>Foo Bar</h2>
   Lorem Ipsum...
</div>

这样我也可以有一个 bar_box 块助手,它也可以有一个 title 方法,输出完全不同的东西。

目前我将它们实现为不同的方法,例如foo_boxfoo_box_titlefoo_box 像这样处理块:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end

【问题讨论】:

    标签: ruby-on-rails ruby block helpers


    【解决方案1】:

    从外观上看,capture 不允许您将任何参数传递到您想要执行的块中。 (b) 中的 bass 参数必须是您定义 title 等方法的某种对象。因此,让我们定义一个辅助类,它将输出您需要的内容,并将其传递给从视图传入的块,然后捕获它并将其包围在 div 中,就像您在上面所做的那样。我会这样做:

    class FooBoxHelper
      include ActionView::Helpers::TagHelper  
      def title(text)
        content_tag(:h2, text)
      end
      def small(text)
        content_tag(:p, text, :class => "small")
      end
    end
    
    def foo_box(&block)
    
      new_block = Proc.new do 
        helper = FooBoxHelper.new
        block.call(helper)
      end
      content_tag(:div, capture(&new_block), :class => 'foo_box')
    end
    

    看看我是如何绕过capture 方法的限制的?通过将一个新的 Proc 绑定到当前作用域,并在那里传递帮助器对象,我们得到一个可以不带参数调用的块,因此可以被capture 接受。此外,请确保您的帮助程序类包含来自ActionView::Helpers 的所有相关帮助程序方法。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多