我遇到了自定义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源代码,但无法弄清楚为什么它会像这样。
答案 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