首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将to_sentence添加到:集合

如何将to_sentence添加到:集合
EN

Stack Overflow用户
提问于 2011-09-28 12:15:08
回答 2查看 201关注 0票数 1

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

代码语言:javascript
复制
<%= render :partial => 'superlative', :collection => @profile.superlatives %>

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

代码语言:javascript
复制
<li class="superlative"><span title="<%= superlative.name %>">
  <%= superlative.body %>
</span></li>

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

代码语言:javascript
复制
<%= render :partial => 'superlative', :collection => @profile.superlatives.to_sentence %>

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-29 01:24:41

哦,现在我明白了。很抱歉给你造成了混乱。这就是我要做的:

在您的控制器中:

代码语言:javascript
复制
@superlative_bodies = @profile.superlatives.map &:body
# Equivalent to: @superlative_bodies = @profile.superlatives.map {|sup| sup.body }

在您的视图中:

代码语言:javascript
复制
= @superlative_bodies.to_sentence

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

代码语言:javascript
复制
= @profile.superlatives.map(&:body).to_sentence

要解释一下,.map是一个非常有用的Ruby方法,它接受一个数组或其他可枚举对象和一个块,并返回一个新的数组,其中每个元素都是在块应用到原始数组后的对应元素。例如:

代码语言:javascript
复制
[ 'foo', 'bar', 'baz' ].map {|word| word.upcase } # => [ 'FOO', 'BAR', 'BAZ' ]
# or
[ 'foo', 'bar', 'baz' ].map &:upcase              # => [ 'FOO', 'BAR', 'BAZ' ]

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

票数 3
EN

Stack Overflow用户

发布于 2011-09-28 13:10:03

也许是这样的吧?

代码语言:javascript
复制
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) %>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7578233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档