2012-04-17 43 views
2

我正在實施用戶評論的顯示/隱藏功能。如何在rails上實現顯示所有評論功能?

這裏討論:https://stackoverflow.com/a/10174194/439688

我的目標是: 1。限制默認顯示的評論2. 2.有文本的跨度,指出總的意見的該特定和微柱時點擊數由用戶將其展開並顯示該微博的所有評論。我將使用Jquery/Ajax來隱藏,顯示,預先等等。

第一個變化是限制向用戶顯示的註釋量,我通過在我的幫助程序中創建一個名爲「comments」的方法來實現此目的,這裏我傳入評論所屬微博的身份。

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但如何將我將上面代碼中每個循環中的micropost的params傳遞給users.js?我不認爲這是可能的。

我的所有評論發佈都是通過ajax完成的,但是因爲我使用了這些表單,所以對於我來說,添加remote => true並創建一些js模板並在ajax post的成功上做了一些操作就容易多了。

不知道我是否正以這種正確的方式去做。我會感謝來自更有經驗的鐵路程序員的一些幫助/建議。

親切的問候

+0

在狀態欄上顯示正在發送的頁面PARAM大多數用戶不能甚至找到位置編輯框鍵入一個url,所以他們只是谷歌的網址。 – 2012-04-17 17:41:42

+0

爲什麼不把你的評論視圖內的部分?然後在點擊事件跨度,你可以調用ajax函數,將更新整個p artial(顯示所有評論)。你也可以傳遞當地人的偏見。我做了類似的事情。但不完全如您的。 – 2012-04-17 17:44:02

回答

2

Rails的基於本地傳遞給這個局部

#最初通過限制部分

#Display所有評論作爲2(或任何你想要的)。然後點擊跨度通過限制爲零。那麼你可以檢查limit是否爲零,你可以查詢沒有限制說明符的模型。

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

使用partials是我如何使用ajax成功發佈到頁面的微博發佈和評論。它工作得很好..我只是在我的users.js裏面使用<%= %>而感到困惑。那是你上面的js代碼進入的地方嗎?資產內部的js文件還是位於您的某個視圖文件夾中? – LondonGuy 2012-04-17 18:24:30

+0

那麼可以有多個地方放js。但在可能的情況下,我已經把它們放在index.html.erb(我的span標籤所在的位置)或放在我要渲染部分的文件中。你可以考慮把rjs文件放到javascript代碼中。 – 2012-04-17 18:34:25

+0

評論如果不夠清楚。 – 2012-04-17 18:35:09

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功能來更新替代的評論數據。

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 
+0

我最初認爲這是一個選項,但是當你開始爲每個微博獲得多個評論時,它就會變得明顯,這可能會成爲一個問題。我明白你的意思,當你說它變得混亂。當事情變成這樣的時候,我會變得困惑和放慢速度。 – LondonGuy 2012-04-17 18:27:47

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請求

爲什麼你關心的鏈接
相關問題