如何将to_sentence添加到:collection

时间:2011-09-28 04:15:08

标签: ruby-on-rails-3 collections

我有以下代码生成最高级列表:

<%= render :partial => 'superlative', :collection => @profile.superlatives %>

上面引用的:partial代码如下:

<li class="superlative"><span title="<%= superlative.name %>">
  <%= superlative.body %>
</span></li>

如何将to_sentence添加到@ profile.superlatives集合中?我试过了:

<%= render :partial => 'superlative', :collection => @profile.superlatives.to_sentence %>

然而,这样做会使@ profile.superlatives从视图中消失。

我查看了文档但找不到答案。

2 个答案:

答案 0 :(得分:2)

哦,现在我明白了。对困惑感到抱歉。这就是我要做的事情:

在您的控制器中:

@superlative_bodies = @profile.superlatives.map &:body
# Equivalent to: @superlative_bodies = @profile.superlatives.map {|sup| sup.body }

在您看来:

= @superlative_bodies.to_sentence

有些人会在视图中执行此操作,而这取决于您:

= @profile.superlatives.map(&:body).to_sentence

要解释一下,.map是一个超级有用的Ruby方法,它接受一个数组或其他Enumerable和一个块,并返回一个新数组,其中每个元素是应用该块后原始数组中的对应元素它。例如:

[ 'foo', 'bar', 'baz' ].map {|word| word.upcase } # => [ 'FOO', 'BAR', 'BAZ' ]
# or
[ 'foo', 'bar', 'baz' ].map &:upcase              # => [ 'FOO', 'BAR', 'BAZ' ]

(当你只想在每个元素上调用相同的单个方法时,后者只是前者的缩短版本。)

答案 1 :(得分:1)

也许是这样的事情?

module ProfilesHelper
  # ...
  def superlatives_items (profile)
    @@acb ||= ActionController::Base.new # required to access render_to_string
    profile.superlatives.collect |superlative|
      acb.render_to_string :partial => 'path/to/partial/superlative',
                           :layout => false,
                           :locals => { :superlative => superlative }
    end
  end
  # ...
end

# In view:

# <%= raw(superlatives_items(@profile).to_sentence) %>