无法捕获Rails helper中的块输出

时间:2015-05-04 07:05:26

标签: ruby-on-rails ruby slim-lang

我遇到了自定义Rails FormBuilder的问题,从昨天晚上开始让我发疯。基本上我想为我的一个构建器方法设置一个可选块,这样我就可以在我的主content_tag中显示其他内容:

def form_field(method, &block)
  content_tag(:div, class: 'field') do
    concat label(method, "Label #{method}")
    concat text_field(method)
    capture(&block) if block_given?
  end
end

当我在我的一个Slim模板中调用该方法时,如下所示:

= f.form_field :email do
  small.help-text
    | Your email will never be public.

它会在<small>的实际输出上方插入块(此处为content_tag内的帮助文字):

<small class="help-text">Your email will never be public.</small>
<div class="field">
    <label for="user_email">Label email</label>
    <input type="text" value="" name="user[email]" id="user_email">
</div>

我尝试了其他几种变体,但似乎我永远无法捕获block的输出。任何想法 - 甚至可能更有趣:对这种行为的解释?我阅读了几篇关于该主题的文章,并查看了Rails源代码,但无法弄清楚为什么它会像这样。

2 个答案:

答案 0 :(得分:5)

正如@Kitto所说,$words = explode(' ', $_GET['word']); $regex = implode('|', $words); $query = "SELECT * FROM table WHERE table.keywords REGEXP '{$regex}'"; :capture以及更多其他帮助程序已实现到@template。

在我的习俗:concat中,我有这个:

FormBuilder

答案 1 :(得分:4)

因此,在进行了一些挖掘之后,事实证明问题在于FormBuilder以及它本身如何处理输出缓冲区。查看ActionView FormHelpers的源代码,提示在@template上调用捕获,如下所示:

def form_field(method, &block)
  content = @template.capture(&block) if block_given?
  content_tag(:div, class: 'field') do
    concat label(method, "Label #{method}")
    concat text_field(method)
    concat content if content.present?
  end
end