我们已经知道,在 /config/routes.rb 里定义的路由,会自动生成对资源的CRUD的操作。但是我们如何处理那些并不是CRUD的操作?下面我们就用一个例子来说明这一点。例如我们在CompanyController里有一个showresults的方法,它显示了某个公司的XXX结果,其方法(action)如下:
class CompaniesController < ApplicationController
..................
def showresults
@company = Company.find(params[:id ])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @company }
end
end
end
当然有action就会有相应的页面showresults.haml,假设页面已经写好,那么需在companies的某个视图里添加一个链接,使其跳转到showresults.haml,如下所示:
= link_to( "查看结果", ???????, :class=>"c")
现在有2个问题摆在我们面前:
1.使用 http 协议的哪个动作来发送这个请求呢?
2.对于这个链接,该如何生成那些 helper方法呢?
第一个问题:因为这个 showresults动作并不是CRUD中的任何一个,所以Rails 也不知道该用http的哪个来做这个事情。不过showresults和show(用get来发送,需传参数)相似,所以应该使用get来发送这个请求。
第二个问题:要生成helper方法,我们还是得在 /config/routes.rb 里定义这个路由,当然定义完路由之后,就会有相应的path和url的helper方法了。
因为这个showresults的操作,仍然是针对companies这个资源的,所以,我们可以在定义路由的时候,使用一个名字叫“member”的hashmap,这个hashmap 的key,就是自定义action的名字,hashmap的value,就是所使用的http的动作,如下所示:
map.resources :companies , :member => { :showresults => :get }
hashmap 的value可以使用 :get, :put, :post, :delete, :any。如果使用了:any,那么可以用http的任何动作来发送这个请求。
定义完这个路由后,我们就可以使用helper方法了:
= link_to( "查看结果", showresults_company_path(@company) , :class=>"c")
如果不定义路由,那么你要写成:
= link_to("查看结果",{ :action=>"showresults", :id => @company.id }, :class=>"c")
显然,定义路由后的链接形式要简单,标准得多^_^