我在视图层中有这个:
<ul class="nav nav-tabs col-md-10 col-xs-12"> -->
<% @months.each do |month| %>
<%= content_tag :li do %>
<%= content_tag :span, nil, class: "underlayer" %>
<%= link_to ... %>
<% end %>
<% end %>
</ul>
@months
是我控制器中的月份名称的简单数组。
我决定重构此代码并将所有视图逻辑放入辅助方法中。所以我开始了:
show.html.erb:
<%= show_calendar %>
助手:
def show_calendar
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
end
我无法弄清楚为什么会这样:当我尝试在阵列上执行each
时:
months.each do |month|
month
end
返回始终是一个数组,而不是单个月。如果我要像这样返回content_tag
:
content_tag :span, month
它将返回:
["<span>Jan</span>", ... ]
我认为我可以将collect
与concat
标记一起使用,但在这种特定情况下,不是我正在寻找的东西,因为我有一个复杂的链接之后的逻辑,从长远来看似乎不适用于concat
。
我最终想要返回的内容应如下所示:
<ul class="nav nav-tabs col-md-10 col-xs-12">
<li><span class="underlayer"></span><a href="#">Jan</a></li>
<li><span class="underlayer"></span><a href="#">Feb</a></li>
...
</ul>
我会感谢each
.. do
行为的任何解释。
答案 0 :(得分:3)
每个标记都返回数组,而不是其中的块。
这样的事情应该有效:
def show_calendar
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
html = ""
months.each do |month|
html << content_tag :span, month # or any other tags/logic
end
html #return the calendar, not the month array
end
答案 1 :(得分:0)
正如评论each
中提到的 Marek 所做的那样。您可能希望您的方法如下:
def show_calendar
months = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
ul_body = months.map { |month| custom_tag(string) }
safe_join(ul_body, "<br />")
end
private
def custom_tag(string)
%(<li><span class="underlayer"></span><a href="#"> #{string} </a></li>)
end