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"项目可能是一个使用HTML、JavaScript和可能的Ajax或WebSockets技术实现的自动更新提醒系统,它帮助用户及时获取并应用软件的新版本。通过学习和理解这些技术,开发者可以创建更互动...
本项目名为"Simple-PHP-Auto-Update-System",其核心功能是通过PHP和jQuery实现一键式更新流程,简化了传统的更新步骤,提高了用户体验。 ### 系统构成 1. **前端界面**:前端部分主要基于HTML和jQuery,负责展示...
spring.jpa.hibernate.ddl-auto=update ``` 然后,创建一个实体类,例如`User.java`,它代表我们要操作的数据库表: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType....
例如,`DWRUtil.setValue`可以方便地设置表单元素的值,`DWRUtil.fillSelect`用于填充SELECT选项,`DWRUtil.update`可以更新指定的DOM元素。 **5. 实战案例** 在提供的资源中,"DWR util_js 整理(DWR 处理各种form...
3. **更新数据**:使用PUT请求,提供需要更新的ID和新数据,服务器端执行`UPDATE news SET ... WHERE id = ?`。 4. **删除数据**:Ajax的DELETE请求对应服务器端的`DELETE FROM news WHERE id = ?`。 ### 四、示例...
### 详谈基于JSON的高级AJAX开发技术 #### 引言 随着互联网技术的不断发展,用户对于网页的实时交互性需求越来越高。AJAX(Asynchronous JavaScript and XML)技术作为现代Web开发的重要组成部分,允许开发者在不...
AjaxUpdater.Update(GETURL, callback); }; ``` ##### 3.3 定义回调函数 当AJAX请求成功后,通常会有一个回调函数来处理返回的数据。这个回调函数可以根据返回的JSON数据更新页面内容。 ```javascript function...
本教程将专注于使用jQuery的AJAX功能进行数据库操作,包括添加(Add)、删除(Delete)、查询(Query)和修改(Update)数据。 首先,我们需要在MySQL数据库中创建一个名为`my_db`的数据库,以存储我们的数据。创建...
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, ...
3. **自动更新 (Auto-Update)**:DWR提供了自动更新功能,当服务器端数据发生变化时,可以自动刷新客户端的相关界面部分,无需用户手动刷新页面。 4. **安全机制**:DWR通过一系列安全措施,如跨站脚本攻击防护...
spring.jpa.hibernate.ddl-auto=update ``` 对于Spring Data JPA,创建实体类,比如User: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ...
<prop key="hibernate.hbm2ddl.auto">update <value>classpath:com/model</value> <!-- 配置数据库连接参数 --> ``` ### 三、Struts与Spring集成 1. 在`web.xml`中配置Spring的上下文加载监听器,...
24. <prop key="hibernate.hbm2ddl.auto">update</prop> 25. </props> 26. </property> 27. <property name="packagesToScan"> 28. <list> 29. <value>com.mvc.entity</value><!-- 扫描实体类,也就是平时所...
$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($...
UPDATE EmployeeSalary SET salary = 5000 WHERE name = '张三'; ``` 查询所有员工薪资: ```sql SELECT * FROM EmployeeSalary; ``` 综上所述,"EmployeeSalarySystem.zip"是一个结合了Ajax技术、Layui框架、...
5. **动态加载数据**:如果数据是从服务器获取的,可以通过AJAX请求`emp2.jsp`这样的后端接口来获取数据,然后动态更新配置对象并重新渲染图表。 在`emp2.jsp`这个文件中,可能是用于处理请求并返回JSON格式的数据...
spring.jpa.hibernate.ddl-auto=update ``` 最后,确保Tomcat服务器的端口号设置为8088,这可以在`application.properties`中完成: ```properties server.port=8088 ``` 通过以上步骤,我们已经实现了Spring ...
这些属性都使用了自动属性(Auto-Implemented Properties)的方式,简化了代码,同时提供了数据验证和业务逻辑扩展的空间。 `Device.cs` 文件中的 `Device` 类则表示设备实体,包含以下字段和属性: 1. `_deviceid...
改进描述:使用ajax改进查询体验友好度主要功能:1、输入城市名称查询邮政编码;2、输入邮政编码查询对应城市;3、DIV+CSS模板方便修改;4、免费、开源程序。安装方法:1、解压后将code目录中文件以2进制上服务器;2...
<input type="text" id="txtSearch" runat="server" class="autoquery" /> <ajax:AjaxPro.AjaxManager ID="AjaxManager1" runat="server" /> <ajax:AutoQueryTextBox ID="autoQueryTextBox1" runat="server" ...