我有一个帮助方法'default_content_for',可用于为yield部分提供默认内容。但是当我使用它时,我从帮助器得到了奇怪的输出。
我很确定我可能会遗漏一些简单的东西,但仍然不确定是什么问题。
标题最终在块的开头上方充满了东西。像这样:
<title> Default Title<!DOCTYPE html> <html> <head> <title> Default Title </title>
application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>
<% default_content_for :title do %>
Default Title
<% end %>
</title>
<%= stylesheet_link_tag :all %>
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>
<% default_content_for :title do %>
Default Title
<% end %>
</title>
<%= stylesheet_link_tag :all %>
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>
帮助方法
module ApplicationHelper
def default_content_for(name, &block)
name = name.kind_of?(Symbol) ? ":#{name}" : name
out = eval("yield #{name}", block.binding)
out = (out ? (out.empty? ? false : out): false) || capture(&block)
concat(out)
end
end
输出
<!DOCTYPE html>
<html><head>
<title> Default Title<!DOCTYPE html> <html> <head> <title> Survey Builder </title>
<script type="text/javascript" src="/javascripts/prototype.js?1314309079"></script>
<script type="text/javascript" src="/javascripts/effects.js?1314309079"></script>
<script type="text/javascript" src="/javascripts/dragdrop.js?1314309078"></script>
<script type="text/javascript" src="/javascripts/controls.js?1314309078"></script>
<script type="text/javascript" src="/javascripts/rails.js?1314309079"></script>
<script type="text/javascript" src="/javascripts/application.js?1314309078"></script>
<meta content="authenticity_token" name="csrf-param">
<meta content="oG4mVUt5wy6aWdhbxmXa3tYh3DUgXVUQy9d6uxng6a0=" name="csrf-token">
</head>
<body>
<div id="user_nav">
Logged in as KARL KIRCH
<a href="/log_out">Log out</a>
</div>
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
</body></html>
答案 0 :(得分:0)
好的,我应该读一些东西。 在rails中,3个块应该使用以下形式:
<%= default_content_for :title do %>
<% end %>
另外helper方法应该只返回一个字符串而不是concat,所以我改变了我的helper方法(来自agmcleod的建议
module ApplicationHelper
def default_content_for(name, &block)
name = name.kind_of?(Symbol) ? ":#{name}" : name
out = eval("yield #{name}", block.binding)
if out && !out.empty?
out
else
capture(&block)
end
end
end