Стиль Reddit вложил/распараллелил/сделал отступ комментарии для направляющих?

Создать Stream невозможно, но вы все равно можете использовать фильтр Guava ( Collections2.filter () или Iterables.filter () в зависимости от того, что вы будете делать с результат) в сочетании с предикатом Гуавы

Predicate predicate = new Predicate() {
        @Override
        public boolean apply(Person person) {
            return person.age >= 18;
        }
    };
Collection result = Collections2.filter(persons, predicate);

Если вам нужна дополнительная информация о фильтре и преобразовании Гуавы, я получил свой источник здесь: https: // www. baeldung.com/guava-filter-and-transform-a-collection

14
задан Samuel 21 January 2009 в 03:13
поделиться

3 ответа

Используя acts_as_tree плагин должен сделать это довольно легким реализовать. Установите его использование

ruby script/plugin install acts_as_tree

app/models/comment.rb

class Comment < ActiveRecord::Base
  acts_as_tree :order => 'created_at'
end

db/migrate/20090121025349_create_comments.rb

class CreateComments < ActiveRecord::Migration
  def self.up
    create_table :comments do |t|
      t.references :parent
      t.string :title
      t.text :content
      ...
      t.timestamps
    end
  end

  def self.down
    drop_table :comments
  end
end

app/views/comments/_comment.html.erb

<div id="comment_<%= comment.id %>">
  <h1><%= comment.title %></h1>
  <%= comment.content %>
  <%= render :partial => 'comments/comment', :collection => comments.children %>
</div>

app/views/comments/show.html.erb

<div id="comments">
  <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
</div>

Волшебство происходит в show.html.erb когда это звонит <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>, это заставит частичное рекурсивно представлять все дочерние комментарии. Если Вы хотите предел глубине, можно сделать это в частичном или в модели.

Править:
Это оставит Вас со всеми комментариями с тем же интервалом в HTML для каждой глубины. Если Вы хотите произвести легкий считать HTML, просто используйте render(...).gsub(/^/, "\t") это будет работать, рекурсивно также производя, приятно расположил HTML с отступом.

Я объединил его в свой собственный метод в app/helpers/application_helper.rb

def indented_render(num, *args)
  render(*args).gsub(/^/, "\t" * num)
end

Таким образом, теперь можно звонить <%= indented_render 1, :partial => 'comments/comment', ... %>

Править:
Фиксированное закрытие пропавших без вести </h1> тег в примере.

40
ответ дан 1 December 2019 в 06:48
поделиться

Вы попробованный acts_as_tree плагин на Вашей модели? Это - официальный компонент ActiveRecord.

http://wiki.rubyonrails.org/rails/pages/ActsAsTree

0
ответ дан 1 December 2019 в 06:48
поделиться

Ссылки на документацию ActsAsTree, предоставленную Гектором и Самуэлем, похоже, не работают. Вы можете получить документы по адресу

 
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree

(я использовал предварительный тег, так как ссылка по какой-то причине продолжала отображаться неправильно).

1
ответ дан 1 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: