Rails 新特性:simply_helpful[转] (1/118)

本帖地址: 复制地址

楼主: CMO涔漠

用户形象图片

Rails 新特性:simply_helpful


Rails SVN 多了一个新插件,simply_helpful,它的意图似乎是要对一些常用的 helper 功能进行简化。

我猜想用插件来实现是不希望对任何人运行的 Edge Rails 造成影响,直到它100%稳定并100%向后兼容。因此如果你想看看这些变动,那么你需要安装该插件到你的应用程序中。

script/plugin install simply_helpful

安装完该插件后,一些基本的 helper 就得到了简化。例如,在用于我的 Venues 控制器的 index.rhtml 内,我曾给这样写过:

<table>

<tr><th>Name</th> <th>City</th> <th>Postcode</th></tr>

<%= render :partial => 'venue', :collection => @venues %>

</table>

注:该表被极大地简单化了;我删去了大部分东西,以更好地理解 simply_helpful 做了什么。

假设 Rails 可以告诉我的 @venues 数组是用 Venue 实例变量组成的,那么新的 helper 不需要我在明确地指出我使用的局部模板名字:

<table>

<tr><th>Name</th> <th>City</th> <th>Postcode</th></tr>

<%= render :partial => @venues %>

</table>

因此 :collection 键就变成多余的了(我们在传递一个数组,所以会被假设为一个集合),就像局部模板组件本身的命名 --- simply_helpful 自动地从被传递对象的类来获得它的位置 --- 在这个例子中,因为它是一个 Venue 对象集合,所以局部模板被假设为位于 venues/_venue.rhtml

上述是集合局部模板的渲染,你也可以得到下面特性:

DOM ID 属性

<%= dom_id(object, prefix = nil) %>

将为屏幕上对象提供一个基于对象的类及数据库 ID HTML ID 属性值。例如,在 dom_id(@person) 中, @person 是个数据库 ID 123 Person 实例,该表达式将返回 person_123 。如果对象还没有被保存到数据库内,id 将会是 new_object_name

通过这个特性可增强 RJS helper ,它意味着你现在可以直接链接到页面上的表现数据对象的 DOM 对象上。现在,下面表现的意思是相同的:

page[:person_123]

page[dom_id(@person)]

page[@person]

DOM Class names

<%= dom_class(object) %>

创建基于 object 类的 CSS 类名称 --- 因此 ProductionType 对象将得到一个 production_type DOM class

这个新特性可能没有 dom_id 对渲染增强的那么激动人心,但是在下一个特性内使用该特性的话,它会为你的 DOM 对象增强清晰的,易读的,一致的类名称。

Form blocks

新的 form_for 句法与新的 Restful 路由结合,会很大地简化表单设置:

1、表单的动作指向一个 update 还是 create 动作,依赖于你的对象是否在先前被保存过。

2、表单将自动地得到一个 new_object edit_object_#(此处的 object 是对象的类名称,并且 # 是它的数据库 ID) DOM id ,这依赖于它是否是一个新的表单。

3、表单也将自动地得到一个 new_object edit_object 类名字(同样,这儿的 object 也依赖于你的对象的类名字)

这意味着对 form_for 的那个调用会得到最大的简化。例如,现在这一行将可对新的及现有的 Venue 实例两者工作:

<% form_for @venue do |f| %>

...

对现有的 venue 对象,将产生:

<form action="http://localhost:3000/venues/123"

class="edit_venue"

id="edit_venue_123"

method="post">

<input name="_method" type="hidden" value="put" />

同样的一行代码对于一个新的 venue 对象,产生:

<form action="http://localhost:3000/venues"

class="new_venue"

id="new_venue"

method="post">

<input name="_method" type="hidden" value="post" />

http://www.matthewman.net/articles/<CHSDATE isrocdate="False" islunardate="False" day="4" month="9" year="2006">2006/09/04</CHSDATE>/new-rails-feature-simply_helpful

SimplyRestful,虽然可以继续用常规方式做事,但如果你使用它,会得到一些更为自由的便利。当 SimplyRestful 承担了控制器端的事情时,在视图端就会开始了一些魔术。

例如:

@person # => <Person id: 1>

render :partial => @person

与下面是一样的:

render :partial => 'people/person', :object => @person

并且

render :partial => @people

与下面一样:

render :partial => 'people/person', :collection => @person

同样

page[@person]

与这个一样

page[dom_id(@person)]

它是

page[:person_1]

同样:

id="< %= "person_" + @person.id%>“

与下面一样:

< % =@person.dom_id%>

回到帖子顶部

1楼[楼主] CMO涔漠

用户形象图片

simply_restful in Rails Core



现在 Rick 已把 simply_restful 插件集成到了 Rails 核心内, Rails 内的 RESTful 设计变得越来越有趣。我发现大多数文档是相当过时的,它的你为什么应该使用具名路由,url 生成等等介绍得很少。




一、URL 结构:

首先,这是大家熟悉的东西:URL 结构。有三个基本的URL ,但每一个都以不同的方式来应答各种 HTTP 动词。使用一个 Order 模型来说明:

---------------------------------------------------------------------------------

具名路由 URL HTTP 动词 控制器动作 

----------------------------------------------------------------------------------

orders_url /posts GET index 

orders_url /posts POST create 

order_url /posts/:id GET show 

order_url /posts/:id PUT update 

order_url /posts/:id DELETE destroy 

new_order_url /posts/new GET new 

edit_order_url /posts/:id;edit GET edit 

-------------------------------------------------------------------------------

复数形式的具名路由可以被认为是“集合” URL 。它允许在一个整体上操作集合:

1、得到所有条目清单,这个例子内是 orders (GET) 

2、创建个新条目(POST) 

换句话说,单数形式的具名路由被用于引用集合内的一个特定条目:在这个例子中是 post 。通过使用 GET,PUT,和 DELETE 动词,你可在这个条目上操作:

1、显示特定条目的属性(GET) 

2、更新特定条目的属性 (PUT) 

3、删除一个特定的条目 (DELETE) 

这儿有两个“奇怪的”URL:’new’ 与 ‘edit’ 。它们被用于显示“create”与“update”URL的表单(通过适当的动词)。




二、设置 routes.rb 文件:

要把一个模型做为一个资源,对于可以按上面描述的方式进行管理的条目,你在 config/routes.rb 文件添加下面行:

ActionController::Routing::Routes.draw do |map|

map.resources :orders

end

可以同一行内指定多个资源,以减少混乱:

map.resources :orders, :invoices, :customers

资源也可以被嵌套,以产生类似的 URL如,/orders/1/invoices/3 :

map.resources :orders do |map|

map.resources :invoices

end

rescource 方法有一些可选参数,但我暂时先不讲…。




三、控制器:

有七个标准的控制器动作。下面以 Order 模型为例子:

class OrdersController < ApplicationController

def index

end

def show

end

def new

end

def create

end

def edit

end

def update

end

def destroy

end

end

这些样板代码足够应答所有的由 map.resources 调用定义的默认 URL 。




四、参数:

当请求单数的 URL 时,你可访问 params[:id] 变量内的的 ID。

Create 或 update 请求会让你通过访问 params[:entity_name] ,在一个 hash 内得到新属性。

当请求嵌套的 URL 时(如上面描述的),你可以访问基于模型名字的所有“父”ID。例如,如果你在定单内被嵌套的发票,像上面例子,你可在控制器内收到 params[:order_id]。




五、具名路由:

使用具名路由非常容易。假设有个 Order 模型,像以前一样,对于单数的 URL ,你可在 @order 变量内得到一个有效定单的实例,你可以链接各种控制器动作:

------------------------------------------------------

控制器动作 ---- 方法调用 

--------------------------------------------------------

index ---- link_to orders_url 

show ---- link_to order_url(@order) 

new ---- link_to new_order_url 

create ---- form_for :order, :url => orders_url, :html => { :method => :post } 

edit ---- link_to edit_order_url(@order) 

update ----- form_for :order, :url => order_url(@order), :html => { :method => :put } 

destroy ---- link_to order_url(@order), :method => :delete 

----------------------------------------------------------------

注意你可以直接传递你希望的实例给单数路由器。还要注意 :method 参数没有在具名路由中给出,相反它被传递给 link_to 或 form_for(或者是它们变体)。

具名路由对嵌套 resource 操作是一样的;你只需要传递“父”的 resource 做为第一个参数:

嵌套路由:

invoices_url(@order)

invoice_url(@order, @invoice)







http://david.goodlad.ca/articles/2006/08/02/simply_restful-in-rails-core







回到帖子顶部
个人信息
  • 荣誉+3
  • 荣誉+2
  • 荣誉+1
  • 荣誉-1
  • 荣誉-2
  • 荣誉-3
发表留言
  • 文章不错!
  • 精华好文!
  • 支持原创文章!
  • 帖子图文并茂,好!
  • 真知灼见,说得好!
  • 恶意广告
  • 违规内容
  • 严重灌水
  • 重复发帖
  • 标题党
你确定要删除此楼层吗
扣20点经验值