Rails:拆分并包装字符串中的每个字符?

时间:2010-01-25 02:43:58

标签: ruby-on-rails ruby

我有类似的东西:

<%= @votes %>

只输出一个字符串,如:

123

是否有一种简单的方法可以用一个带帮助的html包装每个字符?

<span class="outerclass">
  <span class="innerclass">
  1
  </span>
</span>

<span class="outerclass">
  <span class="innerclass">
  2
  </span>
</span>

<span class="outerclass">
  <span class="innerclass">
  3
  </span>
</span>

3 个答案:

答案 0 :(得分:2)

您可以创建一个类似于此的帮助程序:

def wrap_each_char(string, &block)
  string.each_char.map(&block).join
end

然后像这样使用它(erb):

<%- @votes = "123" -%>
<%- wrap_each_char(@votes) do |c| -%>
  <span class="outer"><span class="inner"><%= c %></span></span>
<%- end -%>

更新:以上示例表示将块级内容传递给帮助程序的一种方法,但值得注意的是,只需使用each_char方法就可以简化此特定示例字符串并完全避免帮助:

<%- @votes.each_char do |c| -%>
  <span class="outer"><span class="inner"><%= c %></span></span>
<%- end -%>

答案 1 :(得分:2)

视图:

<% @votes.split('').each do |v| %>
  <%= print_vote(v) %>
<% end %>

助手:

def print_vote(vote)
  content_tag(:span, :class => 'outerclass') do
    content_tag(:span, vote, :class => 'innerclass')
  end
end

我会在他们点击视图之前对阵列进行排序,但是你将不得不在某个地方进行迭代,并且拆分实际上并没有给实现增加太多。我想如果你真的想把所有内容都包含在帮助器里,你可以做类似

的事情

视图:

<%= print_votes(@votes) %>

助手:

def print_votes(votes)
  votes.split('').each do |vote|
    content_tag(:span, :class => 'outerclass') do
      content_tag(:span, vote, :class => 'innerclass')
    end
  end
end

几乎相同,它只取决于你想要放置线条的位置。

答案 2 :(得分:1)

# View
<%= char_classes(@votes) %>

# Helper
def char_classes(string)
  string.split.map { |char| '<span class="outerclass"><span class="innerclass">' + char + '</span></span>'}.join
end

您可能想要选择更具表现力的方法/ var名称......