Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7588642 建立时间:2006年5月29日 |

| |
[Ruby on Rails]REST 与 Rails 软件技术
lhwork 发表于 2007/2/8 10:37:51 |
前一阵子我对 simply_restul 进行为尝试,Rails 核心发布的公告升级了 edge 。它不再是个插件了,它没有了原来的名字并被进行了一些修改,但总的来说还是一样的。我正打算完成一个 REST 控制器的快速教程。它并不是很难---只是我被吓到了。
rails simple
这个命令会创建一个名为 “simple”的 Rails 工程。没有 –d 标志,则它默认会使用 MySQL。
cd rails
mysqladmin -u root create simple_development
mysqladmin -u root create simple_test
上面命令创建数据库,如果这是个更长的教程的话,我会对它测试。
rake rails:freeze:edge
这个命令会让你的工程使用 Rails “Edge” 的最新版本。如果你想跟着做下去的话,你必须得这样做。将来这个步骤将不再需要。
script/generate model Person
我们的例子工程 --- Person 。
db/migrate/001_create_people.rb:
class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.column "name", :string
t.column "bio", :text
end
end
def self.down
drop_table :people
end
end
编辑完上述文件后,执行:
rake db:migrate
我们现使用迁移来创建表。如果一切正常的话,现在你的数据库内已有了一个表 --- “pople”,它有两个列:name 和 bio 。
在你的 config/routes.rb 文件内添加下面行:
map.resources :people
(这是对 simply_restful 的一处改动,现在它是复数)这儿就是魔术发生的地方。这一行代码将给予你一些东西。现在 REST 与你的控制器之间的所有映射都将开始工作。
script/generate controller people index new create show edit update destroy
这将创建带有所有 REST/Rails 动作的控制器。
app/controllers/people_controller.rb:
class PeopleController < ApplicationController
# 许多动作都需要查找在 params[:id] 内发送的 person ,
# 因此就不要再重复操作了。
before_filter :find_person, :except => [:index, :new, :create]
# 映射到 /people - person_url 的具名路由器
# HTTP 动词:GET
def index
@people = Person.find(:all)
respond_to do |format|
format.html
format.xml { render :xml => @people.to_xml }
end
end
# 映射到 /people/new - new_person_url 的具名路由器
def new
@person = Person.new
end
# 在对 /people POST 操作时调用。
def create
@person = Person.new(params[:person])
@person.save!
respond_to do |format|
format.html do
flash[:notice] = "Person was successfuly created"
redirect_to person_url(@person)
end
format.js
end
end
# 映射到 /people/:id - person_url(person_object) 的具名路由器
# HTTP verb: GET
def show
respond_to do |format|
format.html
format.xml { render :xml => @person.to_xml }
end
end
# 映射到 /people/:id;edit - edit_person_url(person_object) 的具名路由
def edit
end
# gets called for PUT to /people/:id
def update
@person.attributes = params[:person]
@person.save!
respond_to do |format|
format.html do
flash[:notice] = "Person updated"
redirect_to person_url(@person)
end
format.js
end
end
# 映射到 /person/:id;destroy
# HTTP 动词: DELETE
def destroy
@person.destroy
respond_to do |format|
format.html do
flash[:notice] = "Person destroyed"
redirect_to people_url
end
format.xml { render :nothing => true }
end
end
protected
def find_person
@person = Person.find(params[:id])
end
end
“这儿有很多代码。这是 person 控制器与你希望在一个 person 上要完成的所有动作。它们非常完美地映射到 HTTP 动词。你应该输入代码(如果生成器为你生成了很多,则你只需要在方法内进行填充)”
你会注意到奇怪的 “respond_to do |format|” 。这是一个很普通的特征:你可以按客户端相要的格式发送它们。因此如果有人请求 /person/1.xml --- 则说明它们明确地想要 xml 输出,就用这个处理。
这就是全部的好东西。我们还可能给所有代码写了一个非常完美的测试,但现在我们还需要视图。
app/views/people/index.rhtml
< % @people.each do |p| %>
<div id="person_<%= p.id %>">
<p>Name:< %= link_to h(p.name), person_url(p) %></p>
<p>Bio:< %= h p.bio %></p>
</div>
< % end %>
< %= link_to "New Person", new_person_url %>
app/views/people/new.rhtml
<h2>New person</h2>
< % form_for :person, @person, :url => person_url, :method => :post do |f| %>
< %= render :partial => "form", :object => f %>
< % end %>
app/views/people/show.rhtml
<h3>< %= h @person.name %></h3>
<p>
< %= h @person.bio %>
</p>
< %= link_to "Edit", edit_person_url(@person) %>
app/views/people/edit.rhtml
<h2>Edit person: <%= h @person.name %></h2>
<% form_for :person, person, :url => person_url(person), :html => { :method => 'put' } do |f| %>
app/views/people/_form.rhtml
<p>
<label for="person_name">Name:</label>
<%= form.text_field :name %>
</p>
<p>
<label for="person_bio">Bio:</label>
<%= form.text_area :bio %>
</p>
<p>
<%= submit_tag %>
</p>
我们旅游结束了。
http://metaatem.net/2006/07/31/rest-and-rails-no-reason-to-be-scared |
|
|