论坛首页 编程语言技术论坛

Rails中使用REST,登录相关的问题,如何获得当前正在处理的url?

浏览 4999 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-03  
如果整个routes是使用传统的mvc方式实现的话,我们可以简单地记录一下当前的controller和action的名字,等到登录成功之后就可以redirect过去。

但是如果使用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呢?
   发表时间: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
0 请登录后投票
   发表时间: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 写道

有时间会去看看的,谢谢。
0 请登录后投票
   发表时间:2007-07-03  
1,使用request.request_uri类似的方法就可以记录当前url
2,使用request.method就可以记录当前:method

上面1和2在application.rb里的login逻辑里捕获即可

另外我觉得有时候完全用REST不是很现实,毕竟REST有一定的适用范围
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics