I've been having problems making threaded comments for the last few
days. Mainly with creating children and displaying the children.
Currently, I have comments shown at the bottom of my articles show view.
The top level comments work, but I do not really know how to implement a
way for users to "reply" to the top level comments and take them to a
form (the comment 'new' view) to create a new comment. I want the
controller to determine if the user is creating the new comment in an
article or in a comment and create the new comment as a child if its
parent is a comment. I've been facing multiple problems, maybe the
recursion messes up and I get an infinite loop.

Here is the articles show controller:
  def show
    @article = Article.find(params[:id])
    @commentable = Article.find(params[:id])
    @comments = @commentable.comments
#    @comments = @commentable.comments.paginate(:page => params[:page])
    @comment = Comment.new
    @title = @article.title
  end

Here is my comments controller:
  def show
    @commentable = find_commentable
    @comment = @commentable.comments.find(params[:id])
#    @comments = @commentable.comments.paginate(:page => params[:page])
  end

  def new
    @commentable = find_commentable
    @comment = Comment.new
  end

  def create
    @commentable = find_commentable
    if @comment.commentable_type == "Comment"
      @comment = @commentable.children.create(param[:comment])
    else
      @comment = @commentable.comments.build(params[:comment])
    end
    @comment.user_id = current_user.id
    if @comment.save
      flash[:success] = "Comment saved."
      redirect_to @commentable
    else
      flash[:error] = "Error in creating comment."
#      @comments = @commentable.comments.paginate(:page =>
params[:page])
      render 'new'
    end
  end

Here is the comment creation form:
<%= form_for([...@commentable, @comment]) do |f| %>
  <%#= render 'shared/error_messages', :object => f.object %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>
  <div class="actions">
    <%= f.submit "Post Comment" %>
  </div>
<% end %>

Here is the loop that goes through all of the existing comments:
<% unless @comments.nil? || @comments.empty? %>
    <%= render :partial => 'comments/comment', :collection => @comments
%>
    <%#= will_paginate @comments %>
<% end %>

Here is what each individual comment looks like:
<div id="comment <%= comment.id %>">
  <%= comment.title %>
  | <%= link_to "Permalink", polymorphic_path([...@commentable, comment]),
:action => :show %>
  | <%= link_to "Reply", polymorphic_path([...@commentable, @comment]),
:action => :new %>
  | <%= link_to "Edit Comment", polymorphic_path([...@commentable,
comment]), :action => :edit %>
  | <%= link_to 'Delete Comment', [...@commentable, comment]], :confirm =>
"Are you sure?", :method => :delete %><br />
  <%= comment.content %><br />
  <%= comment.user.name %><br /><br />
  <%= render :partial => 'comments/comment', :collection =>
@comment.children %>
</div>

When I click reply, I get taken to:
http://localhost:3000/articles/299/comments and not
http://localhost:3000/articles/299/comments/new. I went into rails
console and gave one of my comments a comment child, and the recursive
nature of the threaded comments gave me recursion that crashed my site.
-- 
Posted via http://www.ruby-forum.com/.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to