我有一个帮助者从多个视图中收集数据:
# 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 data
或footer data
。所以似乎只渲染我视图中添加的数据,而不是我在布局中添加的数据。
这样的事情怎么样?在html页面顶部渲染数据,稍后在文档中收集?
答案 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。