التعليقات المتداخلة/المترابطة/المسافات البادئة بنمط Reddit لـ Rails؟

StackOverflow https://stackoverflow.com/questions/463936

سؤال

أتساءل عما إذا كان شخص ما قد قام بالفعل ببناء نظام للتعليقات المترابطة (بسبب عدم وجود مصطلح أفضل) في ريلز أو إذا كنت بحاجة إلى بنائه بنفسي.

في حالة عدم وضوح الأمر، ما أشير إليه هو نظام تعليق مثل نظام Reddit الذي يقوم تلقائيًا بوضع مسافة بادئة للردود بحيث تظهر مثل فروع الشجرة (ويفضل أن يكون ذلك مع التصويت تمامًا كما يفعل Reddit).

إذا كان بإمكان شخص ما أن يوجهني إلى الكود الذي يفعل ذلك، فسيكون موضع تقدير كبير.

أو ربما يوجد مشروع مفتوح المصدر يتضمن هذه الوظيفة.

حتى الآن لم أتمكن من العثور على واحد في Rails.

أيضًا، هل سيكون من الأفضل طرح هذا السؤال في منتدى Rails، وإذا كان الأمر كذلك، أي منتدى؟(أنا جديد في القضبان)

هل كانت مفيدة؟

المحلول

باستخدام 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> العلامة في المثال.

نصائح أخرى

ويبدو أن وصلات إلى وثائق ActsAsTree كما قدمها هيكتور وصموئيل لا بد من كسرها. يمكنك الحصول على مستندات في

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

و(أنا استخدم بطاقة مسبقة كما ترتبط أبقى عرض خاطئ لسبب ما).

وهناك جوهرة has_threaded_comments، لم تستخدم قط، ولكن يبدو أنه يفعل بالضبط هذا: https://github.com/aarongough/has_threaded_comments

هل حاولت acts_as_tree المساعد على النموذج الخاص بك؟ انها عنصر أكتيفيريكورد الرسمي.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top