gpt4 book ai didi

ruby-on-rails - 在 rails helper 中为额外的作用域方法创建一个作用域 block

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:09 24 4
gpt4 key购买 nike

我想在 block 帮助器中定义一些帮助器方法,但将它们保留在 block 的范围内,这样我就可以获得合理的方法名称并且看起来更干净。

假设我想执行以下操作(一个非常基本的示例),在我看来使用助手:

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

产生类似的东西

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

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

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

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

最佳答案

从外观上看,capture 不允许您将任何参数传递到您想要执行的 block 中。 (b) 中 bass 的参数必须是您在其上定义 title 等方法的某种对象。因此,让我们定义一个辅助类,它将输出您需要的内容,并将其传递给从 View 传入的 block ,然后像上面那样捕获它并将其包围在 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 绑定(bind)到当前作用域,并在其中传递辅助对象,我们得到一个可以不带参数调用的 block ,因此可以被 capture 接受。此外,请确保您的帮助器类包含 ActionView::Helpers 中的所有相关帮助器方法。希望这对您有所帮助!

关于ruby-on-rails - 在 rails helper 中为额外的作用域方法创建一个作用域 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com