我有一個輔助方法'default_content_for',可以用來爲yield部分提供默認內容。然而,當我使用它時,我從助手那裏得到了奇怪的輸出。Rails怪異的捕獲塊錯誤
我很確定我可能錯過了一些簡單的東西,但仍然不知道什麼是錯的。
標題結束了整個塊的開頭以上的東西。像這樣:
<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>
helper方法
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>
你調用的content_for(:title)在哪裏,因爲你的方法是通過評估名稱符號來引用它的,而且我發現嵌套的terinary非常難以閱讀,尤其是隨着時間的推移。正確的如果陳述更好的長期使用。或者如果你不需要out = false,那麼只需要:'out || = capture(&block)' – agmcleod
修復了我的幫手方法,看到我的答案。 – joekarl