如何防止在视图助手中打印变量?

时间:2013-12-25 16:16:19

标签: ruby-on-rails ruby arrays ruby-on-rails-4 viewhelper

我有一个从数据库加载的数组。它采用以下格式:

["aaa:bbb", "ccc:ddd"]

需要从数组中构建HTML定义列表:

<dl>
  <dt>aa</dt>
    <dd>bb</dd>
  <dt>cc</dt>
    <dd>dd</dd>
</dl>

看起来很简单,不是吗?

我想创建一个帮助程序,它将遍历数组,拆分:上的项目,并将它们包含在标记中:

<%= build_def_list(array) %>

但是,我遇到了一个问题。也就是说,当我从视图中调用Rails助手时,其所有内容都将转到输出。也就是说,当我在函数体内声明一个变量并为其赋值时,该变量立即转到输出。有没有办法抑制函数体内所有东西的打印?

UPD

说真的,如何用帮手做这个?..

<dl>
    <% deflist.each do |item| %>
          <dt><%= item.split(':').at(0) %>:</dt>
            <dd><%= item.split(':').at(1) %></dd>
    <% end %>
</dl>

1 个答案:

答案 0 :(得分:1)

为你的助手试试这个:

def build_def_list(array) 
  content_tag :dl do 
    array.map { |e| e.split(':') }.collect do |dt, dd| 
      content_tag :dt, dt
      content_tag :dd, dd
    end
  end 
end

然后在您的视图中致电<%= build_def_list(array) %>

添加:(过滤要打印的内容)

感谢@Arup提醒我额外检查:

  

如何防止全部打印?

要仅打印特定项目,您可以首先删除输入数组,删除需要删除的任何元素,然后使用结果数组构建content_tag s:

def build_def_list(array) 
 reject_keys = ['ccc'] 
 array = array.map { |e| e.split(':') }.reject { |e| reject_keys.include? e[0] }

 content_tag :dl do 
    array.collect do |dt, dd| 
      content_tag :dt, dt
      content_tag :dd, dd
    end
  end 
end

这将首先将array的元素拆分为:,如果在reject_keys数组中找到它们,则删除所有元素。然后,结果用于构建content_tag s。