浏览 4999 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-03
但是如果使用REST,则就不能简单地记录controller和action,例如/articles/1;edit这样的url就比较特别。另外一个问题是,除了要记录url外,还要记录使用什么HTTP Method,是GET, Post, PUT还是DELETE。 如果涉及到的action就是标准的index, create, new, show, update, edit, destory,那么可以使用一个case判断,然后调用相应的url helper,比如articles_url,然后把HTTP Method以硬编码的方式写入。但是如果在routes.rb里面添加了自己的routine,比如 map.resource :articles, :collection => { :recent => :get } 那么又要怎么办呢?自己加入的routine有三种类型:collection, :member和:new,HTTP Method也可以随意指定,那么要怎么生成url呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-03
:collection -- add named routes for other actions that operate on the collection.
比如对于如下route: map.resources :messages, :collection => { :rss => :get } 生成的named route为rss_messages,生成的helper方法为rss_messages_path,url则为/messages;rss 该参数形式为#{action} => #{method}的hash,method为:get/:post/:put/:delete/:any,如果method无所谓则可以使用:any :member -- same as :collection, but for actions that operate on a specific member. 即:collection参数为对多个对象操作的方法,:member参数则为对单个对象操作的方法 :new -- same as :collection, but for actions that operate on the new resource action. 详见Rails源码研究之ActionController:八,resources |
|
返回顶楼 | |
发表时间:2007-07-03
hideto 写道 :collection -- add named routes for other actions that operate on the collection.
比如对于如下route: map.resources :messages, :collection => { :rss => :get } 生成的named route为rss_messages,生成的helper方法为rss_messages_path,url则为/messages;rss 该参数形式为#{action} => #{method}的hash,method为:get/:post/:put/:delete/:any,如果method无所谓则可以使用:any :member -- same as :collection, but for actions that operate on a specific member. 即:collection参数为对多个对象操作的方法,:member参数则为对单个对象操作的方法 :new -- same as :collection, but for actions that operate on the new resource action. 我明白restful的routine的原理,问题是如何在代码中自动生成当前处理的url,我现在使用的代码如下: # application.rb def restful_url(options = {}, *parameters_for_method_reference) restful_hash = Hash.new # 先对7个标准的action进行处理 case options[:action] when 'index' restful_hash[:url] = self.send(options[:controller] << '_url') restful_hash[:method] = :get when 'create' restful_hash[:url] = self.send(options[:controller] << '_url') restful_hash[:method] = :post when 'new' restful_hash[:url] = self.send('new_' << options[:controller].singularize << '_url') restful_hash[:method] = :get when 'show' restful_hash[:url] = self.send(options[:controller].singularize << '_url', options[:params]) restful_hash[:method] = :get when 'update' restful_hash[:url] = self.send(options[:controller].singularize << '_url', options[:params]) restful_hash[:method] = :put when 'edit' restful_hash[:url] = self.send('edit_' << options[:controller].singularize << '_url', options[:params]) restful_hash[:method] = :get when 'destroy' restful_hash[:url] = self.send(options[:controller].singularize << '_url', options[:params]) restful_hash[:method] = :delete # 当是其他action时,使用传统的url_for else restful_hash[:url] = url_for(options, parameters_for_method_reference) restful_hash[:method] = :get # 这里要怎么办?从哪里得到HTTP Method信息? end restful_hash end 对以上方法的调用如下: restful_hash = restful_url(:controller => controller_name, :action => action_name, :params => params) session[:intended_url] = restful_hash[:url] session[:intended_method] = restful_hash[:method] 但是使用我这种实现方式,每当有人添加了一个自己的routine时,都要来修改这个restful_url方法。我的意思是有没有什么办法更灵活一些。我这个方法已经考虑了不同controller的情况,因此适用于所有controller的标准action。同时也考虑了嵌套资源。 hideto 写道
有时间会去看看的,谢谢。 |
|
返回顶楼 | |
发表时间:2007-07-03
1,使用request.request_uri类似的方法就可以记录当前url
2,使用request.method就可以记录当前:method 上面1和2在application.rb里的login逻辑里捕获即可 另外我觉得有时候完全用REST不是很现实,毕竟REST有一定的适用范围 |
|
返回顶楼 | |