التعليقات المتداخلة/المترابطة/المسافات البادئة بنمط Reddit لـ Rails؟
-
19-08-2019 - |
سؤال
أتساءل عما إذا كان شخص ما قد قام بالفعل ببناء نظام للتعليقات المترابطة (بسبب عدم وجود مصطلح أفضل) في ريلز أو إذا كنت بحاجة إلى بنائه بنفسي.
في حالة عدم وضوح الأمر، ما أشير إليه هو نظام تعليق مثل نظام 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
المساعد على النموذج الخاص بك؟
انها عنصر أكتيفيريكورد الرسمي.