没有Rails内置帮助程序使用AJAX的最佳实践?

在我的博客应用程序中,一些post显示为摘录 – 即,用户看到第一个(比如说)500个字符,并且可以单击链接查看整个post。 以下是相关部分:

 post) %> 

wrote this ago

length, :omission => "…

Click here for more!

") %>

但是,而不是“点击此处了解更多!” 将用户带到一个单独的页面,我希望它能够填充内联的其余部分。 目前,我已经通过将上面的代码片段放在以下div中来实现这一点:

 <div class="post" id="post_">  'post_content', :locals => { :post => post, :length => 500 } %> 

然后我在我的application.js中使用这个div的id来做AJAX:

 $(document).ready(function() { $("a.more").click(function() { var url = $(this).attr('href'); var id = url.split("/")[2] $.get(url, null, function(data) { $("#post_" + id).html(data); }); return false; }); }); 

这显然很恶心 – 我不希望我的javascript依赖于链接的href中postid的位置,但是我不知道javascript知道哪个post得到的任何其他方式因此div应该插入内容。

实现这一目标的最佳方法是什么? 我应该回到使用rails的AJAX助手吗?

霍勒斯,你是对的。 你根本不需要Rails助手。 为了实现不引人注目的JavaScript Nirvana,你最好避免它们(对不起Marc!)

不引人注目的JS意味着尽可能避免使用嵌入式JS。 实际上,尽量保持松散耦合,但不要完全脱钩。 在您给我们的示例中,这很容易,因为我们有一个来自HREF的URL可以使用。 您的JS不需要“知道”有关如何请求的任何信息。

以下是如何通过HREF的链接盲目发送,并让Rails响应ajax响应(即没有布局)。

解:

  

Schwein Flu Strikes Again

B.Obama wrote this 2 seconds ago

SUMMARY SUMMARY

Click here for more!

 /********* Your JavaScript ***********/ $(document).ready(function() { 

/********* Your JavaScript ***********/ $(document).ready(function() {

$(“a.more”)。click(function(){
$ containing_div = $(e).parents(’div.body’);
var url = $(this).attr(’href’);
$就({
beforeSend:function(request){request.setRequestHeader(“Accept”,“text / javascript”); },
/ *包含所以Rails通过“format.js”响应* /
success:function(response){$(containing_div).empty.append(response); },
类型:’get’,
url:url
});
返回虚假;
});

});

 ########### Your Controller ########### def show @article = Post.find(param[:id]) respond_to do |format| format.html { render :action => "show" and return } format.js { render :partial => "post_content", :layout => false and return } end end 

这也假设你有RESTful路由或类似handle / post /:id

我们完成了! 我相信对我们所有人来说都有一些东西。 :d

在这种情况下,我认为你根本不应该进行AJAX调用。 你已经在post.body中拥有了原始post的全部内容(你没有从db中获取500个字符)而不是使用JQuery进行ajax调用,使用它来隐藏超过500个字符的内容然后当用户点击“更多”链接,它会显示div的其余部分。 您可以在客户端完全执行此操作并保存自己的ajax。

在你的部分:

 
<%= post.body %>

你的JQuery:

 var fullText = $('div.body').html(); $('div.body').html(fullText.slice(0,499) + 'Click here for more!'); $('a.more').live('click', function(event) { this.parent().html(fullText); return false; } 

在我看来,对于这类问题你应该使用rails的助手。

HTML会像:

 My post bla bla bla more 

链接越多:

 <%= link_to_remote( "more",:update => "more_of_#{your_post.id}",:url =>{:controller => "myposts", :action=>"show_more", :id => your_post.id}, %> 

控制器会做类似的事情:

 post = Post.find_by_id(params[:id]) render :text => post.content.slice(100..post.content.size) 

另一种可能同样好的方法是加载所有内容然后隐藏它:

 bla bla bla this is my post blah 
and this is the rest of the article

(关于div标签的onclick可能会在IE中中断,但这是为了给你这个想法)

对我来说这将是最好的方式,除非你有充分的理由避免铁路的助手。

希望有所帮助