诗歌rails之Rails迷思,非得使用Prototype吗?

Prototype是现在众多优秀的Ajax框架中最好的之一,它也是Rails默认的Ajax框架。

但这意味着在Rails上你只能使用Prototype么?当然不是!那使用其他的Ajax框架会很困难么?当然也不是!

Rails上使用其他的Ajax框架其实难以置信的简单。就比如说jQuery吧,你所要做的全部就是把jQuery包放进public/javascripts目录,然后在你的layout文件里面包含进coreui,就像下面一样:

   <%= javascript_include_tag "jquery", "jquery-ui" %>

举个详细一点的例子吧,比如用Ajax提交下面这个form

   <% form_for(Comment.new) do |form| %>
<%= form.text_area :body %>
  <%= form.submit %>
<% end %>

得益于Rails的约定(conventions),这个form已经有一个idnew_comment,现在在application.js里面加一个用jQuery实现的事件:

   $(document).ready(function() {
  $("#new_comment").submit(function() {
     $.post($(this).attr('action') + '.js',
       $(this).serializeArray(), null, 'script');
    return false;
});
});

它会把这个form通过Ajax提交到/comments.js,然后你可以在PostsController捕捉这些信息,并在附上一定的格式后进行响应:

  def create
@comment = Post.create(params[:comment])
  respond_to do |format|
  format.html { redirect_to(@comment) }
    format.js
  end
end

这个format.js是空的,它的的功能仅仅是告诉控制器(controller)当一个JavaScript请求到达时有一个模板(template)会渲染这个页面。这个模板是comments/create.js.erb

  $('#comments').append('<%= escape_javascript(render(:partial => @comment)) %>');
$('#new_comment textarea').val("");
$('#<%= dom_id(@comment) %>').effect("highlight");

通过渲染comments/comment这个partial,它会把新建的@comment模型(model)以及它的id附到一个dom元素。 这会清空form并在以“comment_x”iddom元素上高亮显示这个新的comment

这就是你要做的全部,简单吧。好了,你现在已经可以通过jQuery创建一个Ajax应用了,告诉那些小孩们这是多么简单吧。这肯定会让他们留下深刻的印象。

Rails拥抱所有的Ajax,而不仅仅是Prototype

Rails的基础架构能很容易地使用包括Prototype在内的所有Ajax框架。

如果你不想如我上面描述的那样使用,而想自定义内置的JavaScript,比如remote_form_for之类的,你可以看一下jRails,它会为jQuery模拟Prototypehelpers。当然还有一个相似的项目MooTools正在开发中。

所以,放心地去使用那些适合你的JavaScript库吧,但请不要再因为Rails包含了一个默认的库而哭天喊地了。这就是Rails:它有一大堆默认的配置,如果你不介意,就接受它们;如果你想有所不同,就换一个。

更新:感谢Ryan Bates为我上面列出的步骤制作了视频

posted @ 2009-08-20 11:37  麦飞  阅读(290)  评论(0编辑  收藏  举报