Как добавить to_sentence в коллекцию: - PullRequest
1 голос
/ 28 сентября 2011

У меня есть следующий код, который генерирует список превосходных степеней:

<%= 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 %>

Однако при этом исчезает @ view.superlatives из вида.

Я посмотрел на документы, но не смог найти ответ.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Оооо, теперь я понимаю. Извините за путаницу. Вот что я бы сделал:

В вашем контроллере:

@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 голос
/ 28 сентября 2011

Что-то вроде этого, возможно?

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) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...