1.
这篇文章还是关于AJAX的,算是一个复习把。
这里,我们将要加入一些AJAX功能到一个站点,其中将使用RJS模板。使用RJS是模板是实现AJAX效果的最简单的方法,特别是你需要更新一个页面的多个元素的时候。
在我们的产品页面,用户能够通过一个表格添加评论,当这个表格以HTTP POST方式提交到服务器的时候,服务器处理表格之后render这个页面给浏览器,从而这个页面重新载入。
{这里插入一点render方法的介绍:
模板在哪里: render方法会到template_root全局配置项所指定的目录中去寻找模板文件,--默认情况下,它位于app/views目录下。这个目录又含有子目录,每个子目录对应一个控制器,其中是该控制器需要的视图模板。模板文件的名字与控制器中各个action的名字一一对应。
当然,模板文件也可以不和action对应,只要在控制器中直接调用render()方法就可以渲染这些模板。render有三种使用方式
例如: render(:action => "fake_action_name")
render(:template => 'controller/name')
render(:file => 'dir/template')
其中,第一种方式是指向同一个controller中一个action的名字,但是并不会执行这个action,而是直接调用这个action对应的模板,而当前网址也不会改变成这个action的名字,这是与redirect_to的区别
第二种方式指向另外一个controller中的一个action
第三种方式指向任何一个地方的某个文件,如果你想在多个应用程序之间共享某个视图,这就是一种好的方式}
好了,继续我们前面的AJAX话题,在返回的页面中,有多个元素与提交之前相比发生了变化:
a. 显示当前有多少条评论的数字发生了变化
b. 新的评论加了进去
c. 表格被清空
d. 有一个flash message显示在最上面,来谢谢用户添加了评论。
所有这些变化,我们将要使用AJAX和RJS模板来完成。
2. 修改view
在我们修改view页面的代码之前,我们首先要确定我们已经把prototype和其他的标准的javascript 文件包含进了view中,因为AJAX要用到这些javascript库,为此,我们需要在我们的模板中加入如下一行:
ok,我们可以开始修改view了,当前,我们的view中有一个标准的表格:
这里我们需要做的修改就是使这个form通过AJAX方式提交到服务器,而不是普通的HTTP POST方式。因此我们要用form_remote_for 替换掉form_for. (Rails提供了很多方法来将正常的元素转化成AJAX方式的元素,具体这里就不介绍了,因为我也不知道还有其他什么方法)
如果浏览器关掉了javascript,那么这个form仍然会工作,只是提交的时候是普通的HTTP POST方式。
做了这个修改之后,我们可以刷新一下我们的页面,在console,我们会看到render到浏览器的部分是这样的:
redirecting won't work with an AJAX request, 所以这里要修改,改成根绝接收到的是HTTP POST还是javascript request,来决定返回什么, respond_to 这个方法就是做这个的,这个方法接收一个block, 我们把不同的返回结果放在block里面
好了,如果是js,我们什么也没有定义,那么默认的就会返回RJS模板,下面我们就创建这个RJS 模板。
4. Create RJS 模板
模板的名字是 create.rjs,因为他对应的是create action,并且在收到js请求而不是普通的html请求时候,才会被调用。这个rjs文件将会生成javascript, 并将其返回给浏览器执行,这就是对AJAX的响应。
在这个模板中,首先我们要添加这个新的review到list中,所有的review是按照id顺序被render的, 每一个review通过一个partial叫做 _review.html.erb来render,
下面详细介绍一下各个参数:
Where to insert the HTML (this can be :before, :after, :top or :bottom).
The id of the element we want to modify (our ‘reviews’ list).
The HTML to render. This can be as simple as a string, or, in our case, a partial. We pass the name of the partial and the object to pass to it. (In Rails 2.3 this can be shortened to :partial => @review).
ok,我们已经添加了新的评论,但是现在有多少条评论的数字还没有更新,我们在加入一行rjs code来完成这个任务。这一次,我们使用replace_html这个方法,而不是insert_html方法,因为我们在replace,而不是insert。
下面该介绍replace_html这个方法了,他接收id of the element we want to update 作为第一个参数,然后第二个参数是新的内容,我们这里我们没有@product变量了,因为这次交流的controller实例中没有出现@product, 所以我们只能使用@review.product
还有一个工作,reset the form.
最好,show the flash notice:
一切顺利,但是还有一个问题,就是下次刷新的时候,flash不会消失,这个flash的工作机制决定的,他会一直保持到下一次request.
解决方法很简单,在rjs中,将flash 送到浏览器后,清空flash就可以了。
这篇文章还是关于AJAX的,算是一个复习把。
这里,我们将要加入一些AJAX功能到一个站点,其中将使用RJS模板。使用RJS是模板是实现AJAX效果的最简单的方法,特别是你需要更新一个页面的多个元素的时候。
在我们的产品页面,用户能够通过一个表格添加评论,当这个表格以HTTP POST方式提交到服务器的时候,服务器处理表格之后render这个页面给浏览器,从而这个页面重新载入。
{这里插入一点render方法的介绍:
模板在哪里: render方法会到template_root全局配置项所指定的目录中去寻找模板文件,--默认情况下,它位于app/views目录下。这个目录又含有子目录,每个子目录对应一个控制器,其中是该控制器需要的视图模板。模板文件的名字与控制器中各个action的名字一一对应。
当然,模板文件也可以不和action对应,只要在控制器中直接调用render()方法就可以渲染这些模板。render有三种使用方式
例如: render(:action => "fake_action_name")
render(:template => 'controller/name')
render(:file => 'dir/template')
其中,第一种方式是指向同一个controller中一个action的名字,但是并不会执行这个action,而是直接调用这个action对应的模板,而当前网址也不会改变成这个action的名字,这是与redirect_to的区别
第二种方式指向另外一个controller中的一个action
第三种方式指向任何一个地方的某个文件,如果你想在多个应用程序之间共享某个视图,这就是一种好的方式}
好了,继续我们前面的AJAX话题,在返回的页面中,有多个元素与提交之前相比发生了变化:
a. 显示当前有多少条评论的数字发生了变化
b. 新的评论加了进去
c. 表格被清空
d. 有一个flash message显示在最上面,来谢谢用户添加了评论。
所有这些变化,我们将要使用AJAX和RJS模板来完成。
2. 修改view
在我们修改view页面的代码之前,我们首先要确定我们已经把prototype和其他的标准的javascript 文件包含进了view中,因为AJAX要用到这些javascript库,为此,我们需要在我们的模板中加入如下一行:
<%= javascript_include_tag :defaults%>
ok,我们可以开始修改view了,当前,我们的view中有一个标准的表格:
<%form_for [@product, @review] do |form|%> <ol class="formList"> <li><%=form.label :name, "Name:"%><%=form.text_field :name%></li> <li><%=form.label :content, "Review:"%><%=form.text_area :content, :rows => 5%></li> <li><%=submit_tag "Add comment"%></li> </ol> <%end%>
这里我们需要做的修改就是使这个form通过AJAX方式提交到服务器,而不是普通的HTTP POST方式。因此我们要用form_remote_for 替换掉form_for. (Rails提供了很多方法来将正常的元素转化成AJAX方式的元素,具体这里就不介绍了,因为我也不知道还有其他什么方法)
如果浏览器关掉了javascript,那么这个form仍然会工作,只是提交的时候是普通的HTTP POST方式。
做了这个修改之后,我们可以刷新一下我们的页面,在console,我们会看到render到浏览器的部分是这样的:
<form action="/products/1/reviews" class="new_review" id="new_review" method="post" onsubmit="new Ajax.Request('/products/1/reviews', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;”> 可以看到,有一个onsubmit事件,这就是为什么要浏览器打开javascript才能实现AJAX效果的原因。 3. 修改controller review 里面的表格被提交到了一个叫做create的action(在reviews controller中), 这个action将添加这个review到数据库,设置一个flash notice,并重定向到product page.
def create
@review = Review.new(params[:review])
@review.product_id = params[:product_id]
@review.save
flash[:notice] = "Thank you for your review"
redirect_to product_path(params[:product_id])
end
redirecting won't work with an AJAX request, 所以这里要修改,改成根绝接收到的是HTTP POST还是javascript request,来决定返回什么, respond_to 这个方法就是做这个的,这个方法接收一个block, 我们把不同的返回结果放在block里面
respond_to do |format| format.html {redirect_to product_path(params[:product_id])} format.js end
好了,如果是js,我们什么也没有定义,那么默认的就会返回RJS模板,下面我们就创建这个RJS 模板。
4. Create RJS 模板
模板的名字是 create.rjs,因为他对应的是create action,并且在收到js请求而不是普通的html请求时候,才会被调用。这个rjs文件将会生成javascript, 并将其返回给浏览器执行,这就是对AJAX的响应。
在这个模板中,首先我们要添加这个新的review到list中,所有的review是按照id顺序被render的, 每一个review通过一个partial叫做 _review.html.erb来render,
insert_html :bottom, :reviews, :partial=>'review', :object=>@review
下面详细介绍一下各个参数:
Where to insert the HTML (this can be :before, :after, :top or :bottom).
The id of the element we want to modify (our ‘reviews’ list).
The HTML to render. This can be as simple as a string, or, in our case, a partial. We pass the name of the partial and the object to pass to it. (In Rails 2.3 this can be shortened to :partial => @review).
ok,我们已经添加了新的评论,但是现在有多少条评论的数字还没有更新,我们在加入一行rjs code来完成这个任务。这一次,我们使用replace_html这个方法,而不是insert_html方法,因为我们在replace,而不是insert。
page.replace_html :review_count, pluralize(@review.product.reviews.size, 'Review')
下面该介绍replace_html这个方法了,他接收id of the element we want to update 作为第一个参数,然后第二个参数是新的内容,我们这里我们没有@product变量了,因为这次交流的controller实例中没有出现@product, 所以我们只能使用@review.product
还有一个工作,reset the form.
page[:new_review].reset
最好,show the flash notice:
page.replace_html :notice, flash[:notice]
一切顺利,但是还有一个问题,就是下次刷新的时候,flash不会消失,这个flash的工作机制决定的,他会一直保持到下一次request.
解决方法很简单,在rjs中,将flash 送到浏览器后,清空flash就可以了。
flash.discard
发表评论
-
12.3.3 scaling issue of the status feed
2011-10-30 17:54 825the problem of the implementati ... -
12.3 the status feed
2011-10-30 15:34 8611. we need to get all the micro ... -
12.2 a working follow button with Ajax
2011-10-29 18:10 9141. in the last chapter, in the ... -
12.2 a web interface for following and followers.
2011-10-28 22:14 8801.before we do the UI, we need ... -
12. following user, 12.1 relationship model
2011-10-18 14:29 7551. we need to use a relationshi ... -
11.3 manipulating microposts.
2011-10-17 15:31 9011. since all micropost actions ... -
11.2 show microposts.
2011-10-17 12:01 7051. add test to test the new use ... -
11.1 user micropost -- a micropost model.
2011-10-17 10:43 11081. we will first generate a mic ... -
10.4 destroying users.
2011-10-16 15:47 747in this chapter, we will add de ... -
10.3 showing users list
2011-10-15 20:41 778in this chapter, we will do use ... -
10.2 protect pages.
2011-10-15 15:11 668again, we will start from TD ... -
10.1 updating users.
2011-10-14 18:30 7101. git checkout -b updating-use ... -
9.4 sign out
2011-10-13 15:21 738whew!!!, last chapter is a long ... -
9.3 sign in success.
2011-10-12 15:39 7521. we will first finish the cre ... -
9.1 about flash.now[:error] vs flash[:error]
2011-10-12 15:37 727There’s a subtle difference ... -
9.2 sign in failure
2011-10-12 12:19 660start from TDD!!! 1. requir ... -
9.1 sessions
2011-10-12 10:00 645a session is a semi-permanent c ... -
what test framework should you use?
2011-10-11 16:56 0for integration test, i have no ... -
what test framework should you use?
2011-10-11 16:56 0<p>for integration test, ... -
8.4 rspec integration tests
2011-10-11 16:53 723in integration test, you can te ...
相关推荐
在Rails框架中,rjs文件通常用于实现Ajax(异步JavaScript和XML)功能,通过AJAX,可以无刷新地更新页面部分区域,提高用户体验。虽然现代前端框架如React和Vue.js提供了更强大的解决方案,但在Rails早期,rjs是实现...
RJS templates are an exciting and powerful new type ... This document helps you get acquainted with how RJS templates fit into the Rails framework and gets you started with a few easy-to-follow examples.
**条码检测仪RJS D4000+中文操作说明书** 在信息技术高度发达的今天,条码作为数据传输和管理的重要工具,广泛应用于零售、物流、医疗等多个领域。条码检测仪,如RJS D4000+,是确保条码质量和效率的关键设备。本文...
由于提供的信息有限,我将基于标题《RJS D4000+条码检测仪中文操作说明书》和描述《RJS D4000+条码检测仪中文操作说明书,比较简洁的中文操作说明书,都可以看明白的》进行知识点的生成。同时,会参考提供的部分内容...
RJS通常用于更新页面的部分内容,无需刷新整个页面,实现AJAX(异步JavaScript和XML)效果。在Rails中,RJS通过ActionView的辅助方法与控制器的action配合工作,生成JavaScript代码,这些代码可以在客户端执行,从而...
根据给定的文件信息,关于RJS D4000+条码检测仪的中文设置操作手册,这里可以提炼出一系列相关知识点,帮助用户更好地理解和操作该款条码检测仪。以下知识点涵盖了从条码检测仪的基本概念、操作到维护保养等多方面的...
RJS D4000+条码检测仪分析结果说明书以及使用过程中注意事项。
在IT行业中,优化资源加载和提高页面性能是至关重要的任务之一。`r.js`、`require.js` 和 `Node.js` 是在这个领域中常见的工具,它们在JavaScript模块管理和构建流程中发挥着重要作用。这里我们将深入探讨这三个工具...
在本篇文章中,涉及的知识点主要围绕“无人驾驶自动驾驶智能汽车”的理论、算法以及实现技术展开。文章内容部分提及了计算机视觉与模式识别技术的进步,并且明确指出智能车辆领域已经成为智能交通系统研究的主流课题...
Rust上JavaScript rjs是Rust中的本机JavaScript实现。该项目rjs的目标是在Rust中提供一种快速的本机JavaScript实现。 当前rjs处于alpha状态,这意味着性能和稳定性不能代表我们想要的最终结果,并且公共API可能仍会...
《PyPI官网下载:calmjs.rjs-1.0.0.tar.gz——探索Python库的奥秘》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了无数的开源库,使得Python编程更加便捷高效。今天我们将聚焦于在PyPI上找到...
new Ajax.Request('/hello_world/add', { asynchronous: true, evalScripts: true, parameters: 'id=' + encodeURIComponent(element.id) }); } }); ``` **解释**:设置`photo`元素为接收区,并定义当元素被拖...
RJS.Web.WebControl.PopCalendar.dll下载,用于网页asp 时间选取周别
rjs:R中的建模。JavaScript中的交互性。 rjs旨在帮助您利用JavaScript的可视化库和R的建模包来构建量身定制的交互式应用程序。 (这是的重构版本,在很大程度上是向后兼容的。我不久jsReact教程rjs到rjs ,现在请...
gulp-require-rjs 扩展代码形式 r.js优化插件描述到r.js的gulp接口。 您可以使用r.js优化器同时打包多个文件。 可以将参数直接传递到r.js。 添加一个名为outPath的参数,以便可以更改打包方式; 默认值为baseUrl 。...
本文将重点介绍RJS D4000+和HHP/Honeywell QC800这两款条码检测仪的常见故障及维修方法。 RJS D4000+是一款高级的条码检测仪,它提供了精确的条码分析和评估,以满足各种行业标准。当遇到设备故障时,首先要检查...
rjs:JavaScript中的R 在JavaScript中引入R,这是一种由支持的将R代码直接插入网站的。 您可以通过2个简单的步骤使用它。步骤1 在html文件的任意位置添加[removed][removed] (或在本地下载r.js )。第2步将class = ...
【AJAX树原理分析】 AJAX(Asynchronous JavaScript and XML)技术允许网页在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。在本文中,我们将深入探讨在RAILS(Ruby on Rails)框架中实现的...