在视图中收集数据并在头部输出

时间:2017-11-09 13:07:10

标签: ruby-on-rails erb

我有一个帮助者从多个视图中收集数据:

# application_helper.rb
def data
  @data ||= []
end

在我的HTML中,我想向此助手添加数据。这应该可以在布局,视图和部分内部进行:

# layout.html.erb
<html>
  <head></head>
  <body>
    <section><% data << "section data" %></section>
    <%= yield %>
    <footer><% data << "footer data" %></footer>
  </body>
</html>

# my_view.html.erb (which is rendered with yield)
<h1>My View</h1>
<% data << "view data" %>

问题是,数据应该作为body标签的数据属性呈现,例如

<body data-test="<%= data.to_json %>">

当然,这会渲染一个空数组,因为此时数组尚未填充。

我用

尝试了
<body data-test="<%= yield(:data) %>">
  ...

  <% content_for(:data) do %>
     <%= data.to_json %>
  <% end %>
</body>

但这也行不通。它只有在我将content_for调用放在视图中时才有效。此外,我只获得view data但不是section datafooter data。所以似乎只渲染我视图中添加的数据,而不是我在布局中添加的数据。

这样的事情怎么样?在html页面顶部渲染数据,稍后在文档中收集?

1 个答案:

答案 0 :(得分:0)

<html>
  <head></head>
  <body data-test="<%= content_for(:data) %>">
    <section></section>
    <%= yield %>
    <footer>></footer>
  </body>
</html>

content_for可用于存储内容供以后使用,并提供动态块,因为后续调用content_for连接。

让我们说我们正在渲染users/show:

<h1><%= @user.name %></h1>
<% content_for(:data) { @user.name } %>
<% content_for(:data) { ", " + @user.username } %>

这会给出

<body data-test="john doe, john_doe">

然而,它用于传递数据结构是有问题的,因为它只是一个字符串缓冲区。

更好的选择是事先收集数据并使用JSON将数据传递给javascript。