我最近开始了一个Rails项目并决定使用RESTful控制器.我创建了我的关键实体控制器(如国家)和加入index
,new
,edit
,create
,show
,update
和delete
.我把我添加map.resources :country
到我的路线文件中,生活很美好.
在开发进展一点之后,我开始遇到问题.我有时需要在控制器中执行额外操作.首先,有一个search
动作返回了我喜欢的自动填充搜索框的选项.然后需要在应用程序的不同位置以两种不同的方式显示国家/地区(显示的数据也不同,因此它不仅仅是两个视图) - 我添加了index_full
操作.然后我想在URL中按名称显示一个国家/地区,而不是ID,所以我添加了show_by_name
操作.
你会怎么做时,你需要超出标准的行为index
,new
,edit
,create
,show
,update
,delete
在Rails的一个RESTful控制器?我是否需要在routes.rb文件中添加(和维护)手动路由(这很痛苦),它们是否在不同的控制器中,我是否变得不合适或者我是否缺少基本的东西?
我想我在问,我是否需要更加努力地将行动添加到我的routes.rb文件中以获得RESTful的特权?如果我没有使用map.resources
添加REST好东西,标准:controller/:action, :controller/:action/:id
路由将自动处理几乎所有内容.
我会把它search
视为特例index
.这两个操作都返回一组资源.请求参数应指定页面,限制,排序顺序和搜索查询等内容.
例如:
/resources/index # normal index /resources/index?query=foo # search for 'foo'
在resources_controller中:
before_filter :do_some_preprocessing_on_parameters def index @resources = Resource.find_by_param(@preprocessed_params) end
至于index_full
和search_by_name
,您可能会考虑将当前的控制器分成两部分.关于你所描述的内容有一种气味.
话虽如此,你绝对没有理由强迫你的应用程序在没有提供任何东西的情况下使用宁静的路线/:controller/:action/:id
.要做出决定,请查看您在表单和链接中使用restful资源路由助手的频率.如果你不使用它们,我不会理会它.
如果我超越了模型的标准CRUD操作,我通常只需要根据需要添加方法.搜索是我添加到许多控制器的东西,但不是每个控制器,所以我添加它并正常维护路由:
map.resources :events, :collection => { :search => :get }
将这些操作移动到一个完全独立的控制器可能会使一些控制器保持RESTful,但我发现将它们保存在上下文中会更有用.
REST未指定您无法拥有其他视图.没有真实世界的应用程序只能使用提供的操作; 这就是为什么你可以添加自己的动作.
REST是关于能够对服务器进行无状态调用.您的搜索操作每次都是无状态的,因为到目前为止提供的数据是正确的,对吗?您的备用显示操作也是无状态的,只是一个不同的视图.
至于它们应该是手动路线还是新的控制器,这取决于活动的不同程度.您的备用视图,如果它提供了一整套CRUD(创建,读取,更新,删除)操作,则可以在新控制器中使用.如果您只有数据的备用视图,我只会添加备用视图操作.
换句话说,听起来你的应用程序不是RESTful,这更像是一个意识到自动生成的功能集是一个起点而不是结论的问题.