原文: http://chloerei.com/2012/04/21/rails-3-2-ajax-guide/
Rails Ajax 的两种类型
在 Rails 里面处理 Ajax 大致可以分为两种:
- UJS:服务端返回 Javascript,客户端收到后直接执行
- JSON API:服务端返回数据,客户端收到后本地处理再执行
Rails 自带的 UJS 机制在提供少量 AJAX 操作的时候很便利。如果你只想写 Javascript 原生的 Ajax,或者需要为客户端应用提供 API,那么应该了解 JSON API 方式。
UJS
先看一段代码,这是一个常见的回复表单:
<%= form_for @reply do |f| %>
<%= f.text_area :body %>
<% end %>
对应的 action 如下:
# POST /replies
def create
@reply = @topic.replies.new params[:reply].merge(:user => current_user)
if @reply.save
redirect_to @topic
else
render :new
end
end
创建回复的时候,如果成功,服务端会要求重定向到话题页面,如果不成功,服务器会渲染 :new
页面,让用户再次编辑。
现在用 UJS 方式改写它,回复成功的时候,将回复添加到页面回复列表的后面,否则显示一条错误信息。
首先,为表单添加一个 :remote
参数:
<%= form_for @reply, :remote => true do |f| %>
<%= f.text_area :body %>
<% end %>
将 :remote
设置为 true
后,Rails 的 form_for
helper 会插入一个 data-remote=true
属性,这样它自带的 rails_ujs.js
模块会自动为这个表单开启 UJS 方式的 Ajax。如果你想知道这魔法是怎么实现的,可以去看看 jquery-ujs 的源码。
然后,在对应 action 里加上 respond_to
和 format.js
代码块:
# POST /replies
def create
@reply = @topic.replies.new params[:reply].merge(:user => current_user)
respond_to do |format| # <- 这里
if @reply.save
format.html { redirect_to @topic }
format.js # <- 这里
else
format.html { render :new }
format.js # <- 还有这里
end
end
end
加入 respond_to 代码块后,Rails 会分辨客户端请求格式是 html 还是 js,不同格式请求返回不同的内容。这里的 format.js
表示请求 js 格式的时候按照约定渲染名为 create.js.erb
的模板。
最后,添加一个 create.js.erb 模板:
<% if @reply.errors.empty? %>
$('<%= j(render :partial => 'reply', :object => @reply) %>').appendTo($('#replies'));
<% else %>
alert('@reply.errors.full_messages.join(',')');
<% end %>
这个模板区分了 @reply 保存成功和失败的两种情况,保存成功的时候,新回复会被添加到回复列表的后面,否则会弹出一条错误信息。
JSON API
UJS 的好处是代码量少,可以复用服务端的模板,但不适用于重客户端的场景。现在来看 Rails 提供 JSON API 的方法。
修改 action,添加 format.json
:
# POST /replies
def create
@reply = @topic.replies.new params[:reply].merge(:user => current_user)
respond_to do |format|
if @reply.save
format.html { redirect_to @topic }
format.js { render :layout => false }
format.json { render :json => @reply } # <- 这里
else
format.html { render :new }
format.js { render :layout => false, :status => 406 }
format.json { render :json => {:errors => @reply.errors.full_messages.join(',')} } # <- 还有这里
else
end
end
end
添加这两行后,这个 action 就能处理 JSON 请求了。这个例子没有涉及 API 数据结构设计,如果你需要调整所返回的 JSON 数据的结构,我推荐 jbuilder 模板。
2013-11-19 更新:jbuilder 是 Rails 4 默认带的 gem。
假设我们用 jQuery.ajax 实现客户端逻辑,那么会有类似代码:
$('new_reply_form').on('submit', function(event){
$.ajax({
url: $(this).prop('action'),
dataType: 'json'
}).done(function(data) {
/* 本地逻辑 */
});
})
.done
callback 中获取的 data
就是 JSON API 返回的数据。
该用哪种实现?
如果网站以后端为主,只需要简单的 Ajax 页面更新操作,那么适用 UJS。如果是从前端框架起步,打算搭建重客户端应用,那么适用 JSON API。
相关推荐
Rails 3.2 API 是一个重要的开发资源,主要用于Ruby on Rails框架的开发。Rails是基于Ruby语言的一个开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,广泛应用于构建动态网站和Web应用程序。Rails ...
### Agile Web Development with Rails for Rails 3.2 #### 核心知识点概览 - **Rails 3.2概述** - **敏捷开发方法论** - **Model-View-Controller (MVC) 模式** - **Ruby on Rails基础与高级特性** - **面向对象...
《Ruby on Rails 3.2 Tutorial》是Michael Hartl撰写的一本经典教程,旨在通过实践教学的方式帮助初学者掌握Rails框架。Rails是一个基于Ruby语言的开源Web应用框架,遵循MVC(模型-视图-控制器)架构模式,以其DRY...
Web开发敏捷之道 应用Rails进行敏捷Web开发第4版 原版书及代码 (rails3.2版) 原书名为:Agile Web Development with Rails 4th for Rails 3.2 代码包含了 3.0、3.1、3.2 ,与原书配套的是3.2。 里面包含了第三版的...
rails-prelaunch-signup, web启动预启动站点的Rails 3.2应用程序示例 Rails 应用程序用于启动预启动注册站点Rails 3.2示例应用程序"测试版即将启动"启动预启动注册站点示例应用程序。Rails 预启动注册应用程序插件...
rails3-mongoid-devise, 示例 Rails 3.2应用,带有数据 Mongoid,用于验证 Rails 4.1有关设计的Rails 4.1示例应用程序,请参见:rails设计有一个用于设计的教程:Rails 设计教程。类似示例和教程这是来自 RailsApps...
这个 gem 用于将基本的 Rails 3.2 应用程序升级到 Rails 4。 我们必须将一堆应用程序从 Rails 3.2 升级到 Rails 4。我们构建了这个 gem 来提供帮助。 注意:我们的大多数应用程序都很简单,但这应该可以处理 95% 的...
Ajax-rails-ajax-demo.zip,ruby on rails的ajax演示项目,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的...
使用fullCalendar使用Rails 3.2 我最近用FullCalendar和jquery.rest插件制作了一些资产宝。 这是一个简单的示例,可以看到它们的实际效果。 查看GemFile以及application.js和application.css文件,看看它们在起作用...
相关的示例应用程序可能会有用: 随书 展示了如何集成Foundation 展示了如何集成Bootstrap 使用OmniAuth进行身份验证使用Devise进行身份验证Rails 3.2 此仓库包含一个将与和集成的Rails 3.2示例应用程序。...
综上所述,《Beginning Google Maps Applications with Rails and Ajax》这本书为初学者提供了一条清晰的学习路径,从基础概念到实践案例,全面覆盖了如何使用Google Maps API、Rails以及Ajax技术创建高质量的地图...
Rails 3.2引入了许多改进,其中包括对嵌套表单处理的优化,使得开发者能够更方便地构建复杂的Web应用。本篇文章将深入探讨“Rails 3.2:嵌套形式的演示,第3部分:我们正在开始进攻!”中的关键知识点。 1. **嵌套...
### Ajax on Rails 知识点解析 #### 一、引言 在当今的Web开发领域,Ajax技术已经成为了提升用户体验的重要手段之一。Rails作为一种高效、优雅的Web开发框架,与Ajax技术结合能够创造出功能强大且易于维护的应用...
在本教程中,我们将深入探讨如何在Rails 3.2框架中使用嵌套表单,特别是在"Rails 3.2:嵌套形式的演示第4部分:切换到目标计算机!"这一主题中。这个示例将展示如何为Ship和Pilot模型添加验证规则,以及如何在Ruby ...
Beginning Google Maps Applications with Rails and Ajax: From Novice to Professional
Beginning Google Maps Applications with Rails and Ajax: From Novice to Professional
### 《从新手到专家:使用Rails与Ajax构建Google Maps应用》知识点概览 #### 一、书籍基本信息 - **作者**:Andre Lewis, Michael Purvis, Jeffrey Sambells 和 Cameron Turner - **出版日期**:2007年 - **ISBN-...
pjax_rails, Rails的PJAX集成 用于 Rails 3.2 的 PJAX 通过资产管道将 wanstrath PJAX的Chris 集成到 Rails 3.2 中。要激活,请将它的添加到 app/assets/javascripts/application.j
从事RAILS开发的人员如何使用AJAX. Learn to build dynamic, interactive web applications using the two most important approaches to web development today: Ajax and the phenomenally efficient Ruby on ...