2010-09-21 38 views
0

我正在開發一個Ruby on Rails web應用程序,其中有幾個帖子列表。每篇文章將使用Ajax來加載他們的評論。爲了將它們填充到正確的位置,我正在執行以下操作:Ajax on Rails - 我遇到問題

每個帖子都有一個div,其格式如下:id:<div id="my_div_<%= post.id %>"></div>。所以,例如,如果post.id是12,那麼id將是「my_div_12」。

我的控制器的動作看起來是這樣的:

render :update do |page| 
    page.replace_html 'my_div_' + params[:post_id].to_s, :partial => 'my_comments_section_partial_path' 
end 

這工作正常只有當我在頁面有一個職位只有一次。但在這個網站中,每個帖子可能會被列出不止一次,因爲有幾個列表(最新帖子,流行,上衣等)。他們都將有他們的評論部分顯示。

現在的問題是,由於註釋部分功能在部分視圖內,因此它對每種類型的列表都是一樣的(因爲它是預期的),因此它不會區分div (因爲它們將具有相同的post.id,並且因此具有相同的div的id)。

我現在的問題是:我怎麼能解決這個問題?有沒有更好的和不同的方式來做到這一點?

提前致謝!

編輯:

只是爲了澄清我想要的東西,在幾句話:

我想代碼page.replace_html 'my_div_' + params[:post_id].to_s, :partial => 'my_comments_section_partial_path',以取代部分中EVERY DIV稱爲'my_div' + params[:post_id].to_s(因爲有可能是在同一個頁面上使用相同的ID的多個div)

+0

你的控制器是什麼樣的?你說所有的div都有相同的ID? – Trip 2010-09-21 21:37:46

+0

你想解決什麼問題?給定的帖子將始終具有與顯示在另一個小部件(或任何地方)中的相同帖子相同的評論。 – Eric 2010-09-21 22:46:36

+0

我已經在同一頁面的同一篇文章中找到了更多的地方。現在,每個帖子都有一個「註釋」部分,當單擊「顯示評論」按鈕時,顯示(和加載)部分。在上面發佈的控制器的操作中,我用帖子的評論替換了部分評論的div。所以,這將被替換爲只有一個div(我有一個具有相同ID的div,每個帖子使用相同的id。例如:我在頁面中顯示#2兩次,然後我會有兩個divs與id =「div_post_2」)。所以,我想用相同的ID替換每個div中的評論結果。 – 2010-09-22 15:13:20

回答

1

請注意,在一個頁面上有多個具有相同id的元素會產生技術上無效的html。許多瀏覽器甚至不會渲染所有這些id屬性(留下一個並擦除其餘的)。

一個簡單的解決方案是切換到使用類而不是id。可以有多個具有相同類的元素,每個元素可以有多個類。
我不使用Rails中的內置ajax幫助器,但Google建議it's possible

+0

鏈接爲我工作!謝謝。 – 2010-09-22 17:54:17

0

看起來好像你在同一頁面上有兩組帖子,並且擔心將正確帖子的評論放在正確的位置。我認爲提出兩個Ajax請求會很好。這些網址可能類似於/posts/1/comments/posts/2/comments。基本上你想要的是「給定職位的所有評論」。您可以對您的帖子控制器進行評論操作,以使用Post的has_many :comments關聯。使用URL ID參數,您可以提供帖子ID。您可以通過自定義ID屬性,自定義類或custom data-* attribute將帖子ID從標記中移出。

看起來您正在使用RJS,但我建議使用Prototype或jQuery來創建Ajax請求並指定JSON數據或HTML作爲響應,然後將JSON或HTMl附加到正確的位置。

在jQuery中,我會抓取帖子ID,發出ajax請求,然後附加評論HTML。這沒有經過測試,但大致在代碼中的想法。

var comments_div = $('.post .comments'); /* need a diff. comments div for each */ 
var post_id = $('.post').attr('data-post_id'); 
$.get({'/posts/'+post_id+'/comments', function(data){ comments_div.append(data); } });