2012-04-17 15 views
2

私はユーザーのコメントの表示/非表示機能を実装しています。ruby​​ on railsにshow all comments機能を実装するにはどうしたらいいですか?

ここで議論:2 2に示すデフォルトのコメントは、その特定micropostとするときクリックされたため、総コメント数を述べたテキストとスパンを持って 1.制限:https://stackoverflow.com/a/10174194/439688

私の目的は、にしましたユーザーがそれを拡大して、そのマイクロポストのすべてのコメントを表示します。

最初に変更したのは、ユーザーに表示されるコメントの数を制限することでした。これは、「コメント」というヘルパーのメソッドを作成することで実現しました。私はコメントが属しているマイクロポストのIDを渡します。

def get_comments(micropost_id) 
     Comment.limit(2).order("created_at DESC").where(:micropost_id => micropost_id) 
    end 

ここで、各コメントをループするループは、最新の2つのコメントのみを表示します。

<<% @microposts.each do |m| %> 
    <% if m.poster_id.nil? %> 
     <div class="postHolder"> 
     <nav class="micropostOptions"> 
     <ul class="postMenu"> 
      <li class="deletePost"><%= link_to content_tag(:span, "Delete post"), m, :method => :delete, :confirm => "Are you sure?", :title => m.content, :class => "message_delete", :remote => true %> 
      </li> 
      <li class="disableCommenting"><%= link_to content_tag(:span, "Pause commenting"), "2" %></li> 
      <li class="blockCommenter"><%= link_to content_tag(:span, "Block commenter"), "3" %></li> 
      <li class="openInNewWindow"><%= link_to content_tag(:span, "Open in new window"), "4" %></li> 
      <li class="reportAbuse"><%= link_to content_tag(:span, "Report abuse"), "5" %></li> 
     </ul> 
     </nav> 


       <%= link_to image_tag(default_photo_for_current_user, :class => "poster_photo"), current_users_username %> 

<div class="post_content"> 
    <div class="post_container"> 

     <div class="mainUserNameFontStyle"><%= link_to current_users_username.capitalize, current_users_username %> - <div class="post_time"> <%= time_ago_in_words(m.created_at) %> ago.</div> 
     </div> 
        <%= simple_format h(m.content) %> </div> 
      <div class="commentsCount"> 
       <%= content_tag :span, pluralize(m.comments.count, 'comment'), :class => "view_all_comments" if m.comments.any? %> 
      </div> 
         <% if m.comments.any? %> 

        <% comments(m.id).each do |comment| %> 

        <div class="comment_container"> 

         <%= link_to image_tag(default_photo_for_commenter(comment), :class => "commenter_photo"), commenter(comment.user_id).username %> 

         <div class="commenter_content"> <div class="userNameFontStyle"><%= link_to commenter(comment.user_id).username.capitalize, commenter(comment.user_id).username %> - <%= simple_format h(comment.content) %> </div> 
        </div><div class="comment_post_time"> <%= time_ago_in_words(comment.created_at) %> ago. </div> 


        </div> 


         <% end %> 
        <% end %> 


       <% if logged_in? %> 
       <%= form_for @comment, :remote => true do |f| %> 
       <%= f.hidden_field :user_id, :value => current_user.id %> 
       <%= f.hidden_field :micropost_id, :value => m.id %> 
       <%= f.text_area :content, :placeholder => 'Post a comment...', :class => "comment_box", :rows => 0, :columns => 0 %> 

     <div class="commentButtons">   
      <%= f.submit 'Post it', :class => "commentButton", :disable_with => "Post it" %> 
      <div class="cancelButton"> Cancel </div> 
     </div> 
       <% end %> 

       <% end %> 
    </div> 


</div> 

ここからはわかりにくいところです。私はlink_toを少し使っていますが、ブラウザのステータスバーにコメント数が表示されないようにすることを決めました。これが私がspan ..を使用するように切り替えた理由ですが、現在はlink_to/remote => trueを使用できないため、やりたいことをするのは簡単ではありません。

どのように私は、ユーザーがクリックしたときに、それはそうコメント数はAJAX呼び出しにまたがって作るのですがを指して構成されています

def load_comments 

    @load_comments = Comment.where(:micropost_id => params[:id]) 
    respond_to do |format| 
    format.js { render :load_comments } 
    end 

    end 

私はusers.jsにクリック機能を置くことについて考えたが、どのように私は希望上記のコードの各ループにあるマイクロポストのパラメータをusers.jsに渡しますか?私はそれが可能だとは思わない。

私のコメント投稿はすべてajax経由ですが、これらのフォームを使用したので、remote => trueを追加していくつかのjsテンプレートを作成し、ajax投稿を成功させることができました。

私はこのことについて正しいことをしているのかどうかはわかりません。経験豊富なレールプログラマーの助言やアドバイスをいただければ幸いです。

種類は、別のオプションは、コメントのすべてにだけ出力され、あなたが最初に表示したくないものを隠す

+0

でページのparamを送っていURLを入力するための場所編集ボックスを見つけることもできます。 –

+0

スパムのクリックイベントであなたのコメントを表示しないと、p全体を更新するajax関数を呼び出すことができますartial(すべてのコメントを表示)。地元の人々を部分的に渡すこともできます。私は同じようなことをやった。あなたとまったく同じではありません。 –

答えて

2

Railsの部分

#Display最初は、この部分

#に渡されたローカルに基づいて、すべてのコメントが制限を渡します。ここでは

function update_row(data, status) { 
    $("#comments-table").append(data.html); 
    }; 

は私のコントローラは、ように見えたものです2(またはあなたが望むもの)として。その後、スパンパスの制限をゼロにしてクリックします。 limitがnilであるかどうかを確認することで、制限指定子なしでモデルに問い合わせることができます。

<% @comments = Comment.custom_find(@your_params) %> 
<% @comments.each do |comment| %> 
<%= comment.title %> 
<% end %> 

のjavascript/jqueryの

function load_all_comments(id) 
{ 
    new Ajax.Updater('show_comments', 
     '<%=url_for(:controller => "your_controller", :action => "your_action")%>', { 
     parameters: {'id':id }, 
     method:  'get', 
     onSuccess: function(request){ 
     div_comments = document.getElementById("partial_comments_list"); 
     div_comments.innerHTML = request.responseText; 

     } 
    }); 
} // you can call this js function on span click. use jquery if you want. 

コントローラー:

が続いyour_controllerのyour_action内側に、部分的

render :partial => "show_comments", :layout => false 

をレンダリングすることを忘れてはいけません編集:

you can even pass locals to your partial 

render :partial => "show_comments", :locals => {:post => @post} 

あなたが合格地元の人々に基づいて、あなたの部分図が更新されます。このたびの使い方。

もちろんこれは完全なコード/ソリューションではありません。

もっと良い方法があります。しかし、これは私のためにうまくいった。

+0

パーシャルを使用すると、マイクロポストの投稿と、ajaxを使用してページに投稿されたコメントがどのようにして得られましたかでした。それはうまく働いた..私はちょうど私のusers.js内で<%= %>を使用する方法と混乱していた..あなたのjsコードに入るのはどこですか?あなたの資産の中のjsファイルか、あなたのビューフォルダの1つにありますか? – LondonGuy

+0

jsを配置する場所は複数あります。しかし、場合によっては、私はそれらをindex.html.erb(私のspanタグがあったところ)に置いていたか、または部分的にレンダリングするファイルの中に入れました。 rjsファイルでjavascriptコードを記述することができます。 –

+0

コメントが十分にはっきりしない場合 –

1

について。 <div class="hidden_comments" style="display:none;"> a comment </div>

スパンをクリックしたときに表示するJavaScriptがありますか?

<script type="text/javascript"> 
    $("#span_id").click(function() { 
     $('.hidden_comments').show(); 
}); 
</script> 

これはすばらしいコメントがない場合に効果的です。


あなたが本当にあなたのやり方をしたいと思えば、私はそれを前にやったことがありますが、それは面倒です。

これをアプリケーションに入れます。JS

$('.comment_span').live('click', function() { 
    $.get(this.data_url, null, update_row, 'json'); 
    return false; 
    }); 

あなたのスパンは次のようになります。

<span class="comment_span" data_url="http://website.com/resource/more_comments"> 
    show all comments 
</span> 

この例では、JSONなどのデータを返しますので、私はコメントデータを置き換える更新するupdate_row機能を使用していました。

def more_comments 
    @comments = Comments.all 

    if @comments 
     respond_to do |format| 
     format.js { 
       render :json => { 
        :html => render_to_string(:partial => "comments"), 
        }.to_json 
       } 
     end 
    end 
    end 
+0

私は最初、それをオプションと考えましたが、各マイクロポストについていくつかのコメントを得るときにはっきりとしたように、問題になる可能性があります。私はあなたがそれが乱雑になると言ったときにあなたが意味することを正確に理解します。事がそのようになると、私は混乱し、すごく減速します。 – LondonGuy

0

インデックス操作でこれを行う必要があります。 すべてのコメントを表示するか、現在のセットだけを表示するかを決定するにはパラメータを渡します(私はwill_paginateを使用してこれを処理します) 私の電話ではコードをあまり深く見ていない、しかし、このような何か:?

class CommentsController < ApplicationController 
    def index 
    If params[:show_all] == "true" 
     @comments = Comment.all 
    else 
     @comments = Comment.where(foo: bar).paginate(per_page: 2, page: params[:page]) 
    end 
    end 

次に、あなたはそれがJavaScriptに対応し、なぜあなたは、ステータスバーに表示されているリンクを気にしないほとんどのユーザーはできませんあなたのAjaxリクエスト

関連する問題