2

我正在为用户评论实现显示/隐藏功能。

在这里讨论:https ://stackoverflow.com/a/10174194/439688

我的目标是: 1. 将默认显示的评论限制为 2。 2. 有一个文本跨度,说明该特定微博的总评论数,当用户点击它时,它会展开并显示该微博的所有评论。我会使用 Jquery/Ajax 来隐藏、显示、前置等。

第一个更改是限制向用户显示的评论数量,我通过在我的帮助程序中创建一个名为“comments”的方法来实现这一点,在这里我传入评论所属的微博的 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 稍微进一步,但后来决定我不希望在浏览器状态栏中显示评论计数的 url。这就是我改用 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 中添加一个 click 函数,但是如何将上面代码中每个循环中的微帖子的参数传递给 users.js?我不认为这是可能的。

我所有的评论发布都是通过 ajax 完成的,但是因为我使用了这些表单,所以我很容易添加 remote => true 并创建一些 js 模板并在 ajax 发布成功的情况下做一些事情。

不确定我是否会以正确的方式解决这个问题。我会感谢更有经验的 Rails 程序员的一些帮助/建议。

亲切的问候

4

3 回答 3

2

导轨部分

#显示所有基于本地传递给这个部分的评论

# 最初将限制传递为 2(或任何你想要的)。然后单击跨度通过限制为零。然后您可以检查限制是否为零,您可以在没有限制说明符的情况下查询模型。

<% @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}

每次您的局部视图都会根据您通过的本地人更新时使用它。

当然,这只是一个示例,而不是完整的代码/解决方案。

可能有更好的方法。但这对我来说很好。

于 2012-04-17T17:54:08.630 回答
1

另一种选择是仅输出所有评论并隐藏您不想首先显示的评论。<div class="hidden_comments" style="display:none;"> a comment </div>

然后在单击跨度时只显示一些 javascript 来显示它们?

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

如果您没有大量评论,这将非常有用。


如果你真的想按照自己的方式做,我以前做过,但它会变得混乱。

把它放在你的 application.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 函数更新替换评论数据。

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

这是我的控制器的样子:

  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
于 2012-04-17T17:44:51.520 回答
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 请求发送页面参数

于 2012-04-18T01:31:54.830 回答