.map上的数组到字符串

时间:2014-05-20 10:23:01

标签: ruby-on-rails ruby arrays map

使用.map

时返回一个数组
<li class="mix <%= p.sectors.map {|s| "#{s.name}"} %> all">

给出数组

["Content Management System", "Web Design", "Web Development"]

目前我视图中返回的结果是

<li class="mix ["Content Management System", "Web Design", "Web Development"] all mix_all" </li>

我想要实现的是将每个s.name用作类名,但是在使用

时我遇到了问题
<li class="mix <%= p.sectors.map {|s| "#{s.name}"}.join(" ") %> all">

其中每个单词都被视为一个单独的类,因此Web Design现在是两个类而不是一个

有没有办法让Web Design成为一个类,还是我需要使用不同的命名约定,比如Web-Design才能使它工作?

任何帮助表示赞赏

由于

2 个答案:

答案 0 :(得分:4)

这应该有效:

mix <%= p.sectors.map { |s| s.name.gsub(/\s+/, '-') }.join(' ') %>

答案 1 :(得分:3)

您不能拥有包含空格的班级名称。因此,您需要将短语转换为类名。类名通常是低级的(虽然这不是一个要求)并且用连字符分隔(而不是下划线,尽管这不是一个要求,只是一个惯例)。

所以,你可以按如下方式将它们按顺序连接和连字符分开

<li class="mix <%= p.sectors.map{|sector| sector.name.downcase.gsub(/[^a-z0-9\-]+/, '-') }.join(' ') %> all">

我的正则表达式将用连字符替换1个或多个不是字母,数字或连字符的实例,因此结果应为

<li class="mix content-management-system web-design web-development all mix_all"> 

您可以将其移入模型中:

#in Sector class
def html_classname
  self.name.downcase.gsub(/[^a-z0-9\-]+/, '-')
end

然后将视图代码更改为

<li class="mix <%= p.sectors.map(&:html_classname).join(' ') %> all">