`
花花公子
  • 浏览: 132071 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

rack和actionpack的map对比

    博客分类:
  • ruby
阅读更多
简单的rackup配置
infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, env.inspect]}
use Rack::CommonLogger
use Rack::ShowExceptions

map '/' do
  run infinity
end

map '/version' do
  map '/' do
    run Proc.new {|env| [200, {"Content-Type" => "text/html"}, "infinity 0.1"] }
  end

  map '/last' do
    run Proc.new {|env| [200, {"Content-Type" => "text/html"}, Rack::Request.new(env).params.inspect] }
  end
end

执行先安装rack gem install rack
使用 rackup -R infinity.ru -p 3000

其中map的写法和routes.rb中做法差不多,回顾一下routes.rb中的写法。
ActionController::Routing::Routes.draw do |map|
  map.connect ':controller/:action/:id'
end

routes.rb里面发生了什么呢?很不幸、里面过程错综复杂,横跨了至少四个类Builder,Mapper,Route,RouteSet,我只能告诉你结果,一句map.connect生成了一个Route对象。

rack代码则简单的我可以轻易的讨论。
module Rack
  ...

  class Builder
    def initialize(&block)
      @ins = []
      instance_eval(&block) if block_given?
    end

    ...
    def map(path, &block)
      if @ins.last.kind_of? Hash
        @ins.last[path] = self.class.new(&block).to_app
      else
        @ins << {}
        map(path, &block)
      end
    end

    def to_app
      @ins[-1] = Rack::URLMap.new(@ins.last)  if Hash === @ins.last
      inner_app = @ins.last
      @ins[0...-1].reverse.inject(inner_app) { |a, e| e.call(a) }
    end
    ...

  end
end

module Rack
  ...

  class URLMap
    def initialize(map)
      @mapping = map.map { |location, app|
        if location =~ %r{\Ahttps?://(.*?)(/.*)}
          host, location = $1, $2
        else
          host = nil
        end

        unless location[0] == ?/
          raise ArgumentError, "paths need to start with /"
        end
        location = location.chomp('/')

        [host, location, app]
      }.sort_by { |(h, l, a)| [-l.size, h.to_s.size] }  # Longest path first
    end

    ...
  end
end



注意[0...-1]是不包含-1这个元素的,所以to_app只执行了前两句。map最终生成了一个url和Rack::URLMap对象的Hash。而在rails当中,url被切割成了多个segments。Rails这样作也自有其用处,常见的redirect_to :action => 'action'就是这样构造出url的,但是对于轻量级应用,就有一点大炮打蚊子了。
3
0
分享到:
评论

相关推荐

    rack接收机和多用户检测

    2. **非线性多用户检测**:如迭代检测、最大后验概率(Maximum A Posteriori, MAP)检测和维特比(Viterbi)检测等。这些方法通常能提供更好的性能,但计算复杂度较高,适合于具有高性能需求和足够计算资源的系统。 ...

    rack-reverse-proxy, rack的反向代理.zip

    在Web开发领域,Rack框架是Ruby社区中一个非常重要的组件,它提供了一种标准化的方式来构建Web服务器和应用程序之间的接口。而rack-reverse-proxy则是Rack生态中的一个重要工具,它实现了反向代理功能,使得开发者...

    IBM NetBAY Rack PDU 介绍

    IBM NetBAY Rack PDU是IBM提供的一种数据中心基础设施解决方案,主要功能是管理和分配机架内的电力供应。这种PDU(Power Distribution Unit)分为三种类型,每种都有其特定的应用场景和设计特点,以确保服务器和其他...

    rack-0.87.zip

    Rack在IT行业中是一个重要的组件,尤其在Ruby on Rails社区中,它作为Web服务器和Rails应用之间的接口。这个压缩包可能包含了Rack框架的源代码、配置文件、示例应用或者其他与0.87版本相关的开发资源。 描述 ...

    rack教程(ruby)

    此外,Rack还支持多种轻量级Web框架,如Sinatra等,这些框架本身就是基于Rack构建的,进一步体现了Rack的简洁性和灵活性。 #### 1.3 快速入门 ##### 1.3.1 安装 要开始使用Rack,首先需要安装Ruby环境。一旦Ruby...

    RACK01 网络互联设备

    RACK01 网络互联设备

    工业 PC SIMATIC Rack PC IL 43[手册].pdf

    首先,手册的简介部分主要阐述了文档的用途和适用范围,明确说明了本“使用入门”文档包含调试和使用SIMATIC Rack PC IL 43时所需的全部信息,并强调所有操作必须按照文档中的安全技术提示进行,以保证人身安全和...

    rack-attack, 用于阻塞&节流的rack 中间件.zip

    rack-attack, 用于阻塞&节流的rack 中间件 :: 攻击 !rack 中间件,用于阻塞&节流滥用请求。Rack::Attack 是一个 rack 中间件,用来保护你的网络应用程序不受坏客户端的影响。 它允许基于请求的任意属性的...

    rack-offline, 用于构建脱机web应用程序的rack 和 Rails 插件.zip

    rack-offline, 用于构建脱机web应用程序的rack 和 Rails 插件 HTML5离线HTML5提供了两种在流行的移动设备( 如iPhone和 Android ) 以及基于 webkit 和on的现代桌面浏览器实现。用法使用 Rack::Offline 最简单的方法是...

    rack-recaptcha, 通过Recaptcha验证验证验证的rack 中间件.zip

    rack-recaptcha, 通过Recaptcha验证验证验证的rack 中间件 机架 recaptcha 在web应用程序中删除这个 rack 中间件,通过Recaptcha启用验证验证。:如何使用配置首先,安装库: [sudo] gem 安装机架 recaptcha你必须在...

    三旺 RACK2000说明书(2U,19英寸机架).pdf

    总结以上知识点,RACK2000机架是一款集多项功能于一身的电信级机架式设备,它的设计理念是为了在有限的空间内集成更多的通信设备,同时保证系统的稳定性和便捷的操作性。其在设计中考虑了多种实际运行环境的需求,...

    基于Rack的网络伺服器Serve.zip

    Serve 是一个小型的基于Rack的网络伺服器,它能简化从任何文件目录伺服HTML,ERB,Haml以及大量模板语言的工作。 Serve的目标是成为Rails MVC中View的一个轻量化...Serve是使用Rack和Tilt开发的。 标签:Serve

    rack-1.5.2.gem

    rack-1.5.2.gem,难得资源,注意收起

    艾肯声卡Umix1010Rack_v1.37.10_driver_win10.zip

    总结起来,艾肯Umix1010Rack的驱动程序v1.37.10是其在Windows 10平台高效运行的基础,它涵盖了音频编码解码、采样率和位深度转换、低延迟ASIO支持等多个关键功能。对于专业音频工作者而言,安装并正确配置这个驱动,...

    Rack::UTF8Sanitizer.zip

    Rack::UTF8Sanitizer 是一个 Rack 中间件用来清理 URI 和 HTTP 请求头部中包含的无效 UTF-8 字符。Rails 的使用方法:config.middleware.insert 0, Rack::UTF8SanitizerRack 的使用方法:use Rack::UTF8Sanitizer

    工业 PC SIMATIC Rack PC 840 V2[手册].pdf

    1. SIMATIC Rack PC 840 V2是西门子公司生产的一款工业级PC,主要面向工业控制和自动化领域。它具有较高的稳定性和可靠性,适用于需要长时间连续运行的工业环境。 2. 安全技术提示:在使用本手册进行工业PC的安装和...

    【Muck Rack】2024年年度新闻研究报告.pdf

    【Muck Rack】2024年年度新闻研究报告.pdf【Muck Rack】2024年年度新闻研究报告.pdf【Muck Rack】2024年年度新闻研究报告.pdf【Muck Rack】2024年年度新闻研究报告.pdf【Muck Rack】2024年年度新闻研究报告.pdf...

    Ruby-Rack一个模块化的Ruby服务器接口

    Rack提供了一个最小化,模块化和适应性强的界面,用于在Ruby中开发Web应用程序。 通过以最简单的方式包装HTTP请求和响应,它将Web服务器,Web框架和软件(所谓的中间件)之间的API统一并提炼成单个方法调用。

    rack 接 收 技 术

    主要介绍rake 接 收 技 术 移动通信

Global site tag (gtag.js) - Google Analytics