0

私はレールを初めて使用しますが、DPS のすべての子をインデントする簡単な (または単純ではない) 方法があるかどうか疑問に思っていましたか?

has_many :comments および belongs_to :comment という「Comment」というモデルがあります。私の見解では、各コメントとそのコメントの各コメント、およびそのコメントの各コメントなどを表示する DPS を実装しました。

私のコードは次のようになります。

<div class=feed>
	<% @comments.each do |comment| %>
		<% if comment.comment_id == nil # display all original comments %> 
			
			<!-- subject -->
			<div class="subject">
				<%= comment.subject %>:
			</div>

			<!-- create array of replies -->
			<% replies = Array.new %>	
			<% replies.push(comment) %>
			<% while replies.any? %>

				<% reply = replies[0] %>
				<% replies.delete_at(0) %>
				

				<!--- name -->
				<div class="comment">
					<%= User.find(reply.user_id).name %>
				<!-- comment -->
					<%= reply.body %>
					<% if user_signed_in? %>
						<%= link_to "reply", new_comment_comment_path(reply.id) %>	
					<% end %>
				</div>

				<% reply.comments.each do |further_replies| %>
					<% replies.push(further_replies) %>
				<% end %>
				<br>
			<% end %>
			<br>
		<% end %>
	<% end %>
</div>

各コメントを「返信」にプッシュし、各返信を 1 つずつ確認します。

各子コメントをインデントする良い方法はありますか?

ありがとう!

4

2 に答える 2

0

act_as_tree構造を使用できます。その場合、モデルは次のようになります-

class Comment
   has_many :replies, class_name: 'Comment', foreign_key :comment_id
   belongs_to :user
end

その場合、HTMLコードは次のように非常に単純になります

<div class=feed>
  <% @comments.each do |comment| %>
    <div class="subject">
      <%= comment.subject %>:
    </div>
    <% comment.replies.each do |reply| %>   
      <div class="comment">
        <%= reply.user..name %>
        <%= reply.body %>
        <% if user_signed_in? %>
          <%= link_to "reply", new_comment_comment_path(reply.id) %>    
        <% end %>
      </div>
      <br>
     <% end %>
    <br>
    <% end %>
</div>
于 2015-08-21T18:04:02.213 に答える