Ajax on Rails - 我遇到了问题

时间:2010-09-21 19:10:47

标签: ruby-on-rails ajax

我正在开发一个Ruby on Rails网络应用程序,其中我有几个帖子列表。每篇文章都将使用Ajax加载他们的评论。为了将它们填充到正确的位置,我正在做以下事情:

每个帖子都有一个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'替换名为'my_div' + params[:post_id].to_s EVERY div 中的部分内容(因为在同一页面中可能有多个div)相同的id)

2 个答案:

答案 0 :(得分:1)

请注意,在一个页面上具有多个具有相同ID的元素会产生技术上无效的html。许多浏览器甚至不会渲染所有这些id属性(留下一个并删除其余属性)。

一个简单的解决方案是切换到使用类而不是ID。可以有多个具有相同类的元素,每个元素可以有多个类 我不在Rails中使用内置的ajax助手,但谷歌建议it's possible

答案 1 :(得分: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); }  });