映射几个变量

时间:2013-10-28 20:52:37

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

当我使用此代码生成输出时:

     <h3>
     <% @partner.employees.each do |s| %>
       <%= "#{s.forename} #{s.lastname} " %>
     <% end %>
     <%= " ..." %></h3>

这例如产生了这个输出:

    Josef Smith Daniel Crak ....

我的问题是我试图获得此输出:

    Josef Smith, Daniel Crak ....

我尝试过类似的东西:

    @partner.employees.all.map(:forname, :lastname)

但是这产生了这个错误:

   wrong number of arguments (2 for 0)

我希望有人可以帮我找一个简短的解决方案!感谢

3 个答案:

答案 0 :(得分:4)

你可能想要像

这样的东西

@partner.employees.map { |s| "#{s.forename} #{s.lastname} " }.join(',')

答案 1 :(得分:1)

这是一种方式:

<% @partner.employees.each do |s| %>
       <%= %i(forename lastname).map{|m| s.send(m)}.join(" ") + "," %>
<% end %>

答案 2 :(得分:1)

仅供将来参考,这是正在发生的事情。

map只接受一个参数,一个块。如果你只需要调用一个没有参数的方法,你可以使用&符号前面的符号作为简写,例如。

@partner.employees.map(&:firstname)

这相当于:

@partner.employees.map { |x| x.firstname }

这也相当于:

firstname = :firstname.to_proc
@partner.employees.map(&firstname)

您可以使用相同的符号传递任何proc或lambda -

@partner.employees.map(&lambda { |x| "#{x.firstname} #{x.lastname}" })

当你可以使用传统的块表示法时,这当然有点无意义:

@partner.employees.map { |x| "#{x.firstname} #{x.lastname}" }.join(', ')

(但无论如何都要知道。)