`

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

阅读更多
如果整个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呢?
分享到:
评论
3 楼 hideto 2007-07-03  
1,使用request.request_uri类似的方法就可以记录当前url
2,使用request.method就可以记录当前:method

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

另外我觉得有时候完全用REST不是很现实,毕竟REST有一定的适用范围
2 楼 AllenYoung 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 写道

有时间会去看看的,谢谢。
1 楼 hideto 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

相关推荐

    The rails4 way

    - **RESTful Rails动作集**: 概括了Rails中所有与REST相关的动作集合。 - **结论**: 总结了RESTful设计在Rails开发中的关键作用。 ##### 4. 控制器操作 - **Rack**: 讨论了作为Rails底层基础的Web服务器接口Rack...

    The Rails 4 Way, 3rd edition.pdf

    ### 关于《Rails 4 的方式》第三版 《Rails 4 的方式》是一...通过以上内容的解析,《Rails 4 的方式》不仅为读者提供了全面的技术指导,还帮助开发者掌握了最佳实践,从而能够在实际项目中更高效地使用Rails 4框架。

    Gymify-Backend:这是一个使用Ruby on Rails框架构建的REST API。 该API实现基于令牌的身份验证和授权

    (登录到帐户) /约会-(创建约会)得到 / me-(获取用户信息) /培训师-(获取所有培训师) /约会-(获取当前用户的所有约会) / appointments /:id-(为当前用户获取一个约会)建于Ruby on Rails PostgreSQL ...

    JAVA上百实例源码以及开源项目源代码

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包4

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包7

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包9

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包101

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    Java资源包01

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    rave-server:RESTful 防病毒端点服务器 - 提供 HTTPS 端点以扫描文件中的恶意软件即服务

    这样的服务在当前网络安全环境下尤为重要,因为恶意软件的威胁无处不在,而实时、自动的检测可以帮助企业和个人更好地保护他们的数据和系统安全。 首先,我们来深入了解一下RESTful架构风格。REST...

Global site tag (gtag.js) - Google Analytics