“each”...“do”在辅助方法中使用时返回一个数组?

时间:2013-12-02 11:21:59

标签: ruby-on-rails ruby ruby-on-rails-4

我在视图层中有这个:

<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>", ... ]

我认为我可以将collectconcat标记一起使用,但在这种特定情况下,不是我正在寻找的东西,因为我有一个复杂的链接之后的逻辑,从长远来看似乎不适用于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行为的任何解释。

2 个答案:

答案 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