`

Ajax auto-update

    博客分类:
  • ajax
阅读更多
Ajax 跟 Ruby on Rails 的整合已經眾所皆知,今天心血來潮,想來實做 digg-spy 形式的資料更新。但是我的需求是每隔一段固定的時間更新,而不是一直 append 新的訊息。在參考了幾個網站後,驚訝的發現,這種 auto-update 的 Ajax 怎麼可以這麼簡單(請用 thegiive 的口氣自行想像)。

*** 斜體字為你尚未命名或已經命名好的名稱 ***

[summary] 我們得準備:
  • 一個 controller 裡面的新的 action,假設該 action 名稱為 action-name,該 controller 名稱為 controller-name
  • 一份 RJS template,置放在 /app/views/controller-name/action-name.rjs。
  • 一份 partial template,假設置放在 /app/views/controller-name/_show_topics.rhtml。
  • 在適當的地方加入 javascript。


step 0:
首先在預設的 layout 中掛入 prototype 等 JavaScript。寫法如下:

<%= javascript_include_tag :defaults %>

其中 :defaults 會將 /public/javascripts/ 中所有的 JavaScript 都掛載上來。如果不想全部掛上來的話,可以改寫成 :script-name

step 1:
接著在你的 controller 裡面寫入一個新的 action。假設我們想要每分鐘更新文章列表:

def update_topics
# 取出最新的 forum 文章,get_all_topics 請自己在 model / controller 撰寫
@all_topics = get_all_topics(10) # hard code 是不好的,小朋友不要學。也可以順便做錯誤處理。
end

step 2:
接著是你必須建立一個檔案 /app/views/controller-name/action-name.rjs,在這個 RJS template 裡面使用 prototype helper 裡面的 methods 來與瀏覽器溝通。內容如下:

page.replace_html 'update-topics-div', :partial => 'show_topics', :object => @all_topics
page.visual_effect :highlight, "update-topics-div"

我們用了 replace.html 來幫我們做取代的動作,如果是 digg-spy-style 的話,通常我們會用 insert.html,有空再來寫。值得注意的是,在這個檔案裡面無須使用 <%%> 來內嵌,直接撰寫即可。update-topics-div 這邊代表的是欲取代的 html element id,show_topics 則是欲取代的 partial template(注意 template 的命名有 prefix _,render 時無須 prefix _,也無須副檔名),再利用 :object 將變數 binding 到 template。visual_effect 效果我就不介紹了。

step 3:
當然你要有輸出的 view,我們假設是 /app/views/controller-name/another-action-name.rhtml。部份的片段應該有:

...
<%= render :partial => 'show_topics' %>
...

而我們的 template _show_topics.rhtml 假設長成這個樣子:

<div id='update-topics-div'>
<ul>
<% @all_topics.each{ |topic| %>
<li><%= topic.title %></li>
<% } %>
</ul>
</div>

step 4:
最後我們挑選一個適當的地方加入 JavaScript,什麼叫適當的地方呢?因為有些 template 會共用的關係,如果把 JavaScript 加入到共用的 template,會出現 RJS 找不到 html element id 的錯誤,所以說得擺在適當的地方,當然跟瀏覽器的支援程度也有關係。假設找到了適當的地方,則我們加入 JavaScript 如下所示:

var updateInterval = 60 * 1000; // 每分鐘 update 一次
var timer;

function goUpdateTopics() {
timer = setInterval('updateTopics()', updateTopicsInterval);
}

function updateTopics() {
// url 記得寫對!
url = "/controller-name/action-name";
new Ajax.Request(url, {
asynchronous: true,
method: "get",
});
}
goUpdateTopics();


Well, 經過這四步驟,你應該已經可以快樂地使用 Ajax 整合在 Rails 裡所提供的功能與樂趣。:)

延伸閱讀
分享到:
评论

相关推荐

    auto-update-alert-ju

    综上所述,"auto-update-alert-ju"项目可能是一个使用HTML、JavaScript和可能的Ajax或WebSockets技术实现的自动更新提醒系统,它帮助用户及时获取并应用软件的新版本。通过学习和理解这些技术,开发者可以创建更互动...

    Simple-PHP-Auto-Update-System:允许用户使用PHP和文本文件一键式更新您的Web软件

    本项目名为"Simple-PHP-Auto-Update-System",其核心功能是通过PHP和jQuery实现一键式更新流程,简化了传统的更新步骤,提高了用户体验。 ### 系统构成 1. **前端界面**:前端部分主要基于HTML和jQuery,负责展示...

    Springboot集成spring-data-jpa增删查改使用ajax数据交互

    spring.jpa.hibernate.ddl-auto=update ``` 然后,创建一个实体类,例如`User.java`,它代表我们要操作的数据库表: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType....

    AJAX DWR教程

    例如,`DWRUtil.setValue`可以方便地设置表单元素的值,`DWRUtil.fillSelect`用于填充SELECT选项,`DWRUtil.update`可以更新指定的DOM元素。 **5. 实战案例** 在提供的资源中,"DWR util_js 整理(DWR 处理各种form...

    Ajax基本操作实例

    3. **更新数据**:使用PUT请求,提供需要更新的ID和新数据,服务器端执行`UPDATE news SET ... WHERE id = ?`。 4. **删除数据**:Ajax的DELETE请求对应服务器端的`DELETE FROM news WHERE id = ?`。 ### 四、示例...

    详谈基于JSON的高级AJAX开发技术

    ### 详谈基于JSON的高级AJAX开发技术 #### 引言 随着互联网技术的不断发展,用户对于网页的实时交互性需求越来越高。AJAX(Asynchronous JavaScript and XML)技术作为现代Web开发的重要组成部分,允许开发者在不...

    ajax的json开发步骤和实例

    AjaxUpdater.Update(GETURL, callback); }; ``` ##### 3.3 定义回调函数 当AJAX请求成功后,通常会有一个回调函数来处理返回的数据。这个回调函数可以根据返回的JSON数据更新页面内容。 ```javascript function...

    JQUERY AJAX数据库应用2(增删查改)

    本教程将专注于使用jQuery的AJAX功能进行数据库操作,包括添加(Add)、删除(Delete)、查询(Query)和修改(Update)数据。 首先,我们需要在MySQL数据库中创建一个名为`my_db`的数据库,以存储我们的数据。创建...

    simple-tags

    Add some tools for taxonomies : Terms suggestion, Mass Edit Terms, Auto link Terms, Ajax Autocompletion, Click Terms, Auto terms, Advanced manage terms, Advanced Post Terms, Related Posts by Terms, ...

    DWR学习资料及源代码

    3. **自动更新 (Auto-Update)**:DWR提供了自动更新功能,当服务器端数据发生变化时,可以自动刷新客户端的相关界面部分,无需用户手动刷新页面。 4. **安全机制**:DWR通过一系列安全措施,如跨站脚本攻击防护...

    SpringBootDemo

    spring.jpa.hibernate.ddl-auto=update ``` 对于Spring Data JPA,创建实体类,比如User: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ...

    WEB项目的配置步骤

    &lt;prop key="hibernate.hbm2ddl.auto"&gt;update &lt;value&gt;classpath:com/model&lt;/value&gt; &lt;!-- 配置数据库连接参数 --&gt; ``` ### 三、Struts与Spring集成 1. 在`web.xml`中配置Spring的上下文加载监听器,...

    spring_MVC源码

    24. &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt; 25. &lt;/props&gt; 26. &lt;/property&gt; 27. &lt;property name="packagesToScan"&gt; 28. &lt;list&gt; 29. &lt;value&gt;com.mvc.entity&lt;/value&gt;&lt;!-- 扫描实体类,也就是平时所...

    jQuery+Ajax+PHP“喜欢”评级功能实现代码

    $update_query = "UPDATE pic SET love=love+1 WHERE id=$id"; $insert_query = "INSERT INTO pic_ip (pic_id, ip) VALUES ('$id', '$ip')"; mysqli_query($connection, $update_query); mysqli_query($...

    EmployeeSalarySystem.zip

    UPDATE EmployeeSalary SET salary = 5000 WHERE name = '张三'; ``` 查询所有员工薪资: ```sql SELECT * FROM EmployeeSalary; ``` 综上所述,"EmployeeSalarySystem.zip"是一个结合了Ajax技术、Layui框架、...

    highcharts加载多条曲线数据

    5. **动态加载数据**:如果数据是从服务器获取的,可以通过AJAX请求`emp2.jsp`这样的后端接口来获取数据,然后动态更新配置对象并重新渲染图表。 在`emp2.jsp`这个文件中,可能是用于处理请求并返回JSON格式的数据...

    springBoot登录注册功能的实现

    spring.jpa.hibernate.ddl-auto=update ``` 最后,确保Tomcat服务器的端口号设置为8088,这可以在`application.properties`中完成: ```properties server.port=8088 ``` 通过以上步骤,我们已经实现了Spring ...

    设备管理系统-源代码及运行界面.doc

    这些属性都使用了自动属性(Auto-Implemented Properties)的方式,简化了代码,同时提供了数据验证和业务逻辑扩展的空间。 `Device.cs` 文件中的 `Device` 类则表示设备实体,包含以下字段和属性: 1. `_deviceid...

    渝海邮编查询工具

    改进描述:使用ajax改进查询体验友好度主要功能:1、输入城市名称查询邮政编码;2、输入邮政编码查询对应城市;3、DIV+CSS模板方便修改;4、免费、开源程序。安装方法:1、解压后将code目录中文件以2进制上服务器;2...

    NET文本框输入显示相似记录信息

    &lt;input type="text" id="txtSearch" runat="server" class="autoquery" /&gt; &lt;ajax:AjaxPro.AjaxManager ID="AjaxManager1" runat="server" /&gt; &lt;ajax:AutoQueryTextBox ID="autoQueryTextBox1" runat="server" ...

Global site tag (gtag.js) - Google Analytics