2010-09-21 65 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); } });