`
peryt
  • 浏览: 54424 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • waiting: 既然都指定了dataType为'script'那就不必特别在b ...
    jQuery

AJAX with RJS again

阅读更多
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库,为此,我们需要在我们的模板中加入如下一行:
<%= 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
分享到:
评论

相关推荐

    rjs 技术

    在Rails框架中,rjs文件通常用于实现Ajax(异步JavaScript和XML)功能,通过AJAX,可以无刷新地更新页面部分区域,提高用户体验。虽然现代前端框架如React和Vue.js提供了更强大的解决方案,但在Rails早期,rjs是实现...

    RJS Templates for Rails

    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 D4000+条码检测仪中文操作说明书》和描述《RJS D4000+条码检测仪中文操作说明书,比较简洁的中文操作说明书,都可以看明白的》进行知识点的生成。同时,会参考提供的部分内容...

    一些RJS资源和演示入门教程

    RJS通常用于更新页面的部分内容,无需刷新整个页面,实现AJAX(异步JavaScript和XML)效果。在Rails中,RJS通过ActionView的辅助方法与控制器的action配合工作,生成JavaScript代码,这些代码可以在客户端执行,从而...

    RJS D4000+等级条码检测仪扫描结果说明书

    RJS D4000+条码检测仪分析结果说明书以及使用过程中注意事项。

    RJSD4000条码检测仪 RJS D4000+中文设置操作手册

    根据给定的文件信息,关于RJS D4000+条码检测仪的中文设置操作手册,这里可以提炼出一系列相关知识点,帮助用户更好地理解和操作该款条码检测仪。以下知识点涵盖了从条码检测仪的基本概念、操作到维护保养等多方面的...

    rjs配合node压缩材料

    在IT行业中,优化资源加载和提高页面性能是至关重要的任务之一。`r.js`、`require.js` 和 `Node.js` 是在这个领域中常见的工具,它们在JavaScript模块管理和构建流程中发挥着重要作用。这里我们将深入探讨这三个工具...

    无人驾驶自动驾驶智能汽车:理论,算法和实现【5rjs.cn】

    在本篇文章中,涉及的知识点主要围绕“无人驾驶自动驾驶智能汽车”的理论、算法以及实现技术展开。文章内容部分提及了计算机视觉与模式识别技术的进步,并且明确指出智能车辆领域已经成为智能交通系统研究的主流课题...

    rjs:Rust JavaScript解释器

    Rust上JavaScript rjs是Rust中的本机JavaScript实现。该项目rjs的目标是在Rust中提供一种快速的本机JavaScript实现。 当前rjs处于alpha状态,这意味着性能和稳定性不能代表我们想要的最终结果,并且公共API可能仍会...

    PyPI 官网下载 | calmjs.rjs-1.0.0.tar.gz

    《PyPI官网下载:calmjs.rjs-1.0.0.tar.gz——探索Python库的奥秘》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了无数的开源库,使得Python编程更加便捷高效。今天我们将聚焦于在PyPI上找到...

    RJS Cheatsheet

    new Ajax.Request('/hello_world/add', { asynchronous: true, evalScripts: true, parameters: 'id=' + encodeURIComponent(element.id) }); } }); ``` **解释**:设置`photo`元素为接收区,并定义当元素被拖...

    RJS.Web.WebControl.PopCalendar.dll

    RJS.Web.WebControl.PopCalendar.dll下载,用于网页asp 时间选取周别

    rjs:R包

    rjs:R中的建模。JavaScript中的交互性。 rjs旨在帮助您利用JavaScript的可视化库和R的建模包来构建量身定制的交互式应用程序。 (这是的重构版本,在很大程度上是向后兼容的。我不久jsReact教程rjs到rjs ,现在请...

    gulp-require-rjs

    gulp-require-rjs 扩展代码形式 r.js优化插件描述到r.js的gulp接口。 您可以使用r.js优化器同时打包多个文件。 可以将参数直接传递到r.js。 添加一个名为outPath的参数,以便可以更改打包方式; 默认值为baseUrl 。...

    条码检测仪RJS D4000+ HHP/honeywell QC800故障和维修指导

    本文将重点介绍RJS D4000+和HHP/Honeywell QC800这两款条码检测仪的常见故障及维修方法。 RJS D4000+是一款高级的条码检测仪,它提供了精确的条码分析和评估,以满足各种行业标准。当遇到设备故障时,首先要检查...

    rjs:JavaScript中的R

    rjs:JavaScript中的R 在JavaScript中引入R,这是一种由支持的将R代码直接插入网站的。 您可以通过2个简单的步骤使用它。步骤1 在html文件的任意位置添加[removed][removed] (或在本地下载r.js )。第2步将class = ...

    完成了AJAX树附原理分析

    【AJAX树原理分析】 AJAX(Asynchronous JavaScript and XML)技术允许网页在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。在本文中,我们将深入探讨在RAILS(Ruby on Rails)框架中实现的...

Global site tag (gtag.js) - Google Analytics