`
qiezi
  • 浏览: 497664 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Rails 1.2 REST + Adobe Spry

    博客分类:
  • Ruby
阅读更多
jerryinside介绍了一个adobe的ajax框架,和当初见到rails一样,我几乎是看它一眼就爱上了。它是一个轻量级的ajax框架,以XML作为协议,目前功能还比较单一,不过几乎完全就是我所期待的。

Rails生成XML轻而易举,Rails 1.2的REST也是一项另人心动的功能,而Spry也是以资源作为操作对象,这2者结合会发生什么?我试着学习Spry的内涵,并结合Rails做点测试性应用,以确定是否值得迁移稍大点的项目到它上面。

首先建立一个项目:
rails test -d progresql

修改配置,让它正确连接到数据库,建立相应数据库。

进入项目文件夹,安装rails 1.2
rake rails:freeze:edge TAG=rel_1-2-0_RC1


既然要测试rest,就用scaffold_resource吧:
script/generate scaffold_resource post title:string body:text created_at:time
script/generate scaffold_resource comment post_id:integer body:text created_at:time

它自动在config/routes.rb里面添加了2行:
map.resources :posts
map.resources :comments

我的post和comment是一对多关联的,所以这里做点修改:
map.resources :posts do |post|
  post.resources :comments
end

并且修改Post和Comment这2个model类:
class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

因为上面已经指定了几个字段,所以它为我们生成了数据库模式,把它导入数据库:
rake db:migrate


修改app/views/posts/index.rhtml:
<h1>Listing posts</h1>

<table>
  <tr>
    <th>Title</th>
    <th>Body</th>
    <th>Created at</th>
    <th>Comments</th>         # <======
  </tr>

<% for post in @posts %>
  <tr>
    <td><%=h post.title %></td>
    <td><%=h post.body %></td>
    <td><%=h post.created_at %></td>
    <td><%= link_to 'Comments', comments_path(post) %></td>          # <======
    <td><%= link_to 'Show', post_path(post) %></td>
    <td><%= link_to 'Edit', edit_post_path(post) %></td>
    <td><%= link_to 'Destroy', post_path(post), :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New post', new_post_path %>

打标记的2行是我添加的。

接下来在CommentController里添加点代码:
before_filter :find_post
...
#最后面
  protected
    def find_post
      @post = Post.find(params[:post_id])
    end


查找所有的comment_path,添加一个参数@post,比如comment_path(comment),就改成comment_path(@post, comment),包括所有的rhtml文件,我不知道有没有更方便的做法,不过我没找到命令行生成时指定这个参数。

查找所有的Comment.find(...),修改为@post.comments.find(...)。create方法修改成这样:
  def create
    @comment = @post.comments.create(params[:comment])  # <=====

    respond_to do |format|
      unless @comment.new_record?  # <=====
        flash[:notice] = 'Comment was successfully created.'
        format.html { redirect_to comment_path(@post, @comment) }
        format.xml  { head :created, :location => comment_path(@post, @comment) }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @comment.errors.to_xml }
      end
    end
  end

标记的2行是我修改的。修改就完成了,下面测试一下。

启动服务器,打开 http://localhost:3000/posts,点击“New Post”添加几条记录。

接着点击每条记录后的Comments链接,各添加几条评论。

这才刚完成服务端代码。下面是视图处理,这里不打算演示太多功能(实际上我也没研究出多少)。

把Spry的几个脚本文件拷到public/javascripts下。

打开app/views/layout/posts.rhtml,添加2行:
  <%= javascript_include_tag 'xpath' %>
  <%= javascript_include_tag 'SpryData' %>

这个演示只需要这2个文件。

把app/views/posts/index.rhtml备份一下,然后打开修改成这样:
<h1>Listing posts</h1>

<script language="javascript">
var dsPosts = new Spry.Data.XMLDataSet("posts.xml", "posts/post")
var dsComments = new Spry.Data.XMLDataSet("posts/{dsPosts::id}/comments.xml", "comments/comment")
</script>

<table spry:region="dsPosts">
  <tr>
    <th>Index</th>
    <th onclick="dsPosts.sort('title', 'toggle')">Title</th>
    <th>Body</th>
    <th onclick="dsPosts.sort('created-at', 'toggle')">Created at</th>
  </tr>
  <tr spry:repeat="dsPosts" onclick="dsPosts.setCurrentRow('{ds_RowID}')">
    <td>{ds_RowNumberPlus1}</td>
    <td>{title}</td>
    <td>{body}</td>
    <td>{created-at}</td>
  </tr>
</table>

<hr />
Comments:
<div spry:region="dsComments">
  <div spry:repeat="dsComments">
    {body}<br />
    Comment At: {created-at}
    <hr />
  </div>
</div>

这短短一点代码完成了什么?

1、ajax抓取post数据
2、点击post记录行时,下面的Comments区域将动态请求服务器,提取属于该post的comments,Cool!它也会自动判断数据是否请求过,如果已经请求过则不会再请求。
3、点击表头中的"Title"和"Created At"这2个字段,表格会排序,Cool!

暂时只研究了这么些。
分享到:
评论
6 楼 qiezi 2006-12-23  
做简单的数据展示,spry很容易做,scriptaculous实现起来反而麻烦。

实际上由于scriptaculous在IE上的性能问题,我已经放弃了它,转而使用dojo。
5 楼 fredzhang 2006-12-23  
Adobe的spry对比prototype和scriptaculous有哪些特色令人心动呢?为什么要采用这个库来结合rails做应用呢?
4 楼 dwangel 2006-12-22  
scaffold_resource看起来是从ruby到数据库,如果,我数据库里建了表,怎么把字段映射到ruby呢?
3 楼 qiezi 2006-12-11  
这个库只是个轻量级的呀,目前看来包装得有些紧,我想提取点数据自己处理都不方便。。Flash肯定还是它的大方向嘛。

Flash做界面我感觉比HTML要方便多了,容易控制,调试方便,兼容性也比较好,目前linux版的player 9也在开发中。。

你最近常玩消失哦。。
2 楼 cookoo 2006-12-11  
哇,这个库做数据展示很不错啊。不过Adobe怎么现在开始热衷Ajax了,不搞它的Flash啦?
1 楼 mafa 2006-12-08  
好啊~!支持一个。我也研究研究~!

相关推荐

    rails+grape+swagger+devise+capistrano 简单融合示例

    总结来说,这个"rails+grape+swagger+devise+capistrano"的简单融合示例展示了一个完整的、功能齐全的API项目架构。Rails作为基础框架,Grape负责API的构建,Swagger用于API的文档化,Devise处理用户认证,而...

    Ruby+Rails+社交+教程

    这个“Ruby+Rails+社交+教程”显然旨在引导开发者如何利用Rails的灵活性和强大功能构建一个完整的社交平台。以下是教程可能涵盖的一些核心知识点: 1. **Ruby基础知识**:首先,你需要对Ruby编程语言有基本的理解,...

    Ruby+Rails+社交+教程3

    本教程“Ruby+Rails+社交+教程3”旨在帮助开发者掌握如何利用Ruby的强大功能和Rails的优雅设计来构建一个具有用户交互性的社交平台。 首先,让我们深入了解一下Ruby。Ruby是一种面向对象的编程语言,以其简洁、易读...

    Ruby+Rails+社交+进阶教程5

    在本“Ruby+Rails+社交+进阶教程5”中,我们将深入探讨如何利用Ruby on Rails框架构建一个功能丰富的社交网络平台。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    Ruby on Rails.rar+MVC+RESTfule+Rails等系列教程

    Rails框架入门 MVC架构理解 数据库设计与迁移 ActiveRecord模型操作 Rails中的控制器编写 视图层HTML与ERB 路由系统详解 RESTful设计原则 Rails中的表单处理 Rails与JavaScript集成 Rails中的测试驱动开发 部署Rails...

    应用Rails进行REST开发

    #### 1.2 为什么使用REST? REST为Web开发带来了以下几方面的提升: 1. **简明的URL**:REST风格的URL旨在定位资源而非调用某个操作。通常情况下,URL会包含控制器名称和资源ID,而具体的操作则隐含在HTTP方法中...

    在RHEL上安裝設置ROR(nginx+passenger+ruby+rails+oracle+netzke)

    在RHEL(Red Hat Enterprise Linux)系统上搭建Ruby on Rails(简称RoR)应用程序环境是一项技术性较强的任务,尤其当涉及到与其他服务如Nginx、Phusion Passenger、Ruby、Rails以及Oracle数据库集成时。以下是对这...

    Agile Web Development with Rails 2 Edition正式版

    一旦官方发布了Rails 1.2版本的Gem,用户可以卸载临时版本的Rails,并移除`vendor/rails`目录。 #### 四、Rails 1.2版本特性 尽管本书没有详细介绍Rails 1.2版本的具体特性,但从上下文中可以推测出此版本可能包括...

    math_game:一个实验游戏,练习Rails + Hotwire + Turbo

    这是一个实验性游戏,可练习Ruby on Rails + Hotwire + Turbo的组合。 转到查看它正在运行。 邀请朋友一起玩。 游戏 两名玩家在五轮中回答简单的数学方程式,每轮有四个备选方案。 游戏仅接受第一个答案。 如果答案...

    jax-on-rails:Ruby on Rails实时博客+入门套件

    jax-on-rails Ruby on Rails实时博客+入门套件 入门 克隆存储库 $ git clone https://github.com/jacksonmccluskey/jax-on-rails.git 变更目录 $ cd ruby-live-blog ...Pusher-与Pusher REST API交互的Ruby宝石

    使用rails编写REST风格的web应用

    总结来说,"使用rails编写REST风格的web应用"涉及的内容包括Rails框架基础、MVC模式的理解、RESTful设计原则的应用、路由配置、控制器和模型的编写、视图渲染以及相关的测试和安全措施。学习这部分内容将使开发者...

    Pragmatic - Agile Web Development with Rails 2nd

    《Pragmatic - 敏捷Web开发与Rails第二版》一书聚焦于使用Rails框架进行敏捷Web开发,深入探讨了Rails 1.2版本的特性、应用与实践。Rails作为一个不断演进的框架,其核心开发者团队持续进行更新,添加新功能、修复...

    Agile Web Development with Rails 2nd Edition

    尽管本书并未详细列举Rails 1.2的所有新增特性,但从上下文可以推测出,1.2版本可能包括但不限于以下更新点: - **性能优化**:提高应用程序的响应速度和并发处理能力。 - **安全性增强**:加强了默认的安全设置,...

    RailsAPI+React+Deviseの认证机能さんプル_Ruby_TypeScript.zip

    标题 "RailsAPI+React+Deviseの认证机能さんプル_Ruby_TypeScript.zip" 提供了一个项目概览,它是一个使用Rails API、React前端和Devise进行身份验证的示例应用。这个项目融合了Ruby on Rails后端开发框架、React...

    入门客户端:Rails 5 API + Ember +语义UI demostarter项目-客户端

    Rails 5 API + Ember +语义UI演示/入门项目。 可以在找到后端项目。 命令历史 ember new starter-client ember install ember-simple-auth npm install ember g route login ember g component login-form ember g ...

    docker-rails-nginx-unicorn:Docker Rails + Nginx + Unicorn(来自Ubuntu 16.04和Ruby 2.4.0)

    docker-rails-nginx-unicorn Docker Rails + Nginx + Unicorn(来自Ubuntu 16.04和Ruby 2.4.0) 易于使用的docker导轨。 较少的配置,负担得起的生产。 包括什么 独角兽,nginx,领班 mysql,PostgreSQL库 用法 在...

    CRA+RailsAPI+设计登录+ActiveAdmin样板_Ruby_JavaScript_下.zip

    标题 "CRA+RailsAPI+设计登录+ActiveAdmin样板_Ruby_JavaScript_下" 提供了关于项目的核心技术栈,其中包括Create React App (CRA)、Ruby on Rails API 和 ActiveAdmin,以及登录功能的设计。这是一份使用前端React...

    Ruby On Rails系列从入门到精通实战教程 Ruby基础+Rails框架+网上商城项目实战

    Ruby On Rails系列从入门到精通实战教程 Ruby基础+Rails框架+网上商城项目实战

Global site tag (gtag.js) - Google Analytics