Rails源代码分析(14):ActionController::MimeResponds

具身智能的边缘计算核心构成方案 摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠 阅读详情
  • 什么是MimeResponds

MimeResponds主要是为了支持Web Service请求:

比如 /people/list.html 返回一个html格式的响应

比如 /people/list.xml 返回xml格式的响应

Rails determines the desired response format from the HTTP Accept header submitted by the client.

  1.          def index
  2.            @people = Person.find(:all)
  3.       
  4.            respond_to do |format|
  5.              format.html
  6.              format.xml { render :xml => @people.to_xml }
  7.            end
  8.          end
也可以自己增加MINE Type
  Mime::Type.register "image/jpg", :jpg
这个方法我们后面再分析分析

  • 实现
里面只有一个public方法 respond_to:
  1.       def respond_to(*types, &block)
  2.         raise ArgumentError, "respond_to takes either types or a block, never both" unless types.any? ^ block // 参数错误只允许传types或者block
  3.          
  4.         // 如果传入types那么构建block
  5.         block ||= lambda { |responder| types.each { |type| responder.send(type) } }
  6.         responder = Responder.new(self)
  7.         //调用responder的type指名的方法 实际上先调用method_missing
  8.         block.call(responder)
  9.         responder.respond
  10.       end
为了了解清楚实际的代码,先看看register方法:

mine_types.rb里面
  1. Mime::Type.register "*/*", :all
  2. Mime::Type.register "text/plain", :text, [], %w(txt)
  3. Mime::Type.register "text/html", :html, %w( application/xhtml+xml ), %w( xhtml )
  4. Mime::Type.register "text/javascript", :js, %w( application/javascript application/x-javascript )
  5. Mime::Type.register "text/css", :css
  6. Mime::Type.register "text/calendar", :ics
  7. Mime::Type.register "text/csv", :csv
  8. Mime::Type.register "application/xml", :xml, %w( text/xml application/x-xml )
  9. Mime::Type.register "application/rss+xml", :rss
  10. Mime::Type.register "application/atom+xml", :atom
  11. Mime::Type.register "application/x-yaml", :yaml, %w( text/yaml )
  12. Mime::Type.register "multipart/form-data", :multipart_form
  13. Mime::Type.register "application/x-www-form-urlencoded", :url_encoded_form
  14. # http://www.ietf.org/rfc/rfc4627.txt
  15. Mime::Type.register "application/json", :json, %w( text/x-json )
mine_type.rb里面

Mime::Type.register 方法的实现:
  1.       def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
  2.         Mime.instance_eval { const_set symbol.to_s.upcase, Type.new(string, symbol, mime_type_synonyms) } 
  3.         #动态的把symbol(:html :text :js等转化为常量)
  4.         # HTML = Type.new("text/html", :html, %w( application/xhtml+xml ))
  5.         SET << Mime.const_get(symbol.to_s.upcase)
  6.         # 把这个常量放入SET中
  7.         ([string] + mime_type_synonyms).each { |string| LOOKUP[string] = SET.last } unless skip_lookup 
  8.         #所有mine_types都设置到lookup中
  9.         ([symbol.to_s] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext] = SET.last }
  10.         # 所有扩展都设置到扩展中
  11.       end
  1.       def lookup(string)
  2.         LOOKUP[string]
  3.       end
  4.       def lookup_by_extension(extension)
  5.         EXTENSION_LOOKUP[extension]
  6.       end

Mine::Type实体的对象方法:
  1.     def initialize(string, symbol = nil, synonyms = [])
  2.       @symbol, @synonyms = symbol, synonyms
  3.       @string = string
  4.     end
  5.     
  6.     def to_s
  7.       @string
  8.     end
  9.     
  10.     def to_str
  11.       to_s
  12.     end
  13.     
  14.     def to_sym
  15.       @symbol || @string.to_sym
  16.     end
  17.     def ===(list)
  18.       if list.is_a?(Array)
  19.         (@synonyms + [ self ]).any? { |synonym| list.include?(synonym) }
  20.       else
  21.         super
  22.       end
  23.     end
  24.     
  25.     def ==(mime_type)
  26.       return false if mime_type.blank?
  27.       (@synonyms + [ self ]).any? do |synonym| 
  28.         synonym.to_s == mime_type.to_s || synonym.to_sym == mime_type.to_sym 
  29.       end
  30.     end
  31.     # Returns true if Action Pack should check requests using this Mime Type for possible request forgery.  See
  32.     # ActionController::RequestForgerProtection.
  33.     def verify_request?
  34.       !@@unverifiable_types.include?(to_sym)
  35.     end
  36.     def html?
  37.       @@html_types.include?(to_sym) || @string =~ /html/
  38.     end
  39.     private
  40.       def method_missing(method, *args)
  41.         if method.to_s =~ /(/w+)/?$/
  42.           $1.downcase.to_sym == to_sym
  43.         else
  44.           super
  45.         end
  46.       end



实现
  1.     class Responder #:nodoc:
  2.       def initialize(controller)
  3.         @controller = controller
  4.         @request    = controller.request
  5.         @response   = controller.response
  6.         @mime_type_priority = Array(Mime::Type.lookup_by_extension(@request.parameters[:format]) || @request.accepts) // 根据@request的参数:format就是扩展来查询,如果没有就是在accepts方法里获取
  7.         @order     = []
  8.         @responses = {}
  9.       end
  10.       def custom(mime_type, &block)
  11.         #如果是Mine::Type那么直接返回
  12.         #如果不是,那么lookup table中去查找
  13.         mime_type = mime_type.is_a?(Mime::Type) ? mime_type : Mime::Type.lookup(mime_type.to_s)
  14.         @order << mime_type
  15.         # 设置一个Proc等待调用
  16.        @responses[mime_type] ||= Proc.new do
  17.           @response.template.template_format = mime_type.to_sym #返回symbol作为格式
  18.           @response.content_type = mime_type.to_s #返回to_s就是类似"text/html"这段
  19.           block_given? ? block.call : @controller.send(:render, :action => @controller.action_name)
  20.           #如果没有设置block直接调用render方法 
  21.           # 例如 format.html
  22.           #如果设置那么执行block
  23.           # 例如:format.xml { render :xml => @people.to_xml }
  24.         end
  25.       end
  26.       def any(*args, &block)
  27.         if args.any?
  28.           args.each { |type| send(type, &block) }
  29.         else
  30.           custom(@mime_type_priority.first, &block) //取优先级第一个的mine_type
  31.         end
  32.       end
  33.       def method_missing(symbol, &block)
  34.         mime_constant = symbol.to_s.upcase
  35.         if Mime::SET.include?(Mime.const_get(mime_constant)) 
  36.           #如果在SET中包含了这个常量就调用custom才处理这个常量
  37.           custom(Mime.const_get(mime_constant), &block)
  38.         else
  39.           super
  40.         end
  41.       end
  42.       def respond
  43.         for priority in @mime_type_priority
  44.           if priority == Mime::ALL
  45.             @responses[@order.first].call
  46.             return
  47.           else
  48.             if @responses[priority]
  49.               @responses[priority].call
  50.               return # mime type match found, be happy and return
  51.             end
  52.           end
  53.         end
  54.         if @order.include?(Mime::ALL)
  55.           @responses[Mime::ALL].call
  56.         else
  57.           @controller.send :head, :not_acceptable
  58.         end
  59.       end
  60.     end

其中Request的accepts方法如下:
  1.     def accepts
  2.       @accepts ||=
  3.         if @env['HTTP_ACCEPT'].to_s.strip.empty?
  4.           [ content_type, Mime::ALL ].compact # make sure content_type being nil is not included
  5.         else
  6.           Mime::Type.parse(@env['HTTP_ACCEPT'])
  7.         end
  8.     end


数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句 某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建 阅读详情

相关推荐

保姆级教程:在Windows 10/11上安装配置KNIME 5.8.0(含中文文本库更新)

本文提供在Windows 10/11系统上安装配置KNIME 5.8.0的详细指南,包括中文文本库更新和性能优化方案。从环境准备、安装流程到中文文本处理能力强化,逐步指导用户搭建高效的数据分析环境,特别针对国内网络环境和中文用户需求提供实用解决方案。

weixin_29081101的博客 670

Selenium 4.11.0 多浏览器并行测试:Chrome/Firefox/Edge 3环境配置与脚本示例

本文详细介绍了Selenium 4.11.0在多浏览器并行测试中的配置与实战技巧,涵盖Chrome、Firefox和Edge三大主流浏览器的环境搭建、脚本示例及最佳实践。通过自动化测试和并行执行,显著提升测试效率和覆盖率,适用于Web应用的质量保障。

hideto 435

电力市场小白必看:手把手教你用Matlab实现市场出清电价计算(附完整代码)

本文为电力市场初学者提供了使用Matlab计算市场出清电价的完整指南。通过Yalmip和Matpower工具包,详细讲解了从环境配置到模型构建、求解及结果分析的整个过程,帮助读者快速掌握节点电价计算的核心技术。

weixin_30379531的博客 73

微信防撤回补丁 RevokeMsgPatcher 完整指南:3分钟装好,兼容与失效排查

刚打完的字,被一句“你撤回了一条消息”从聊天框里抹掉,只能干瞪眼。RevokeMsgPatcher 就是为 Windows PC 端做的微信防撤回补丁,让被撤回的消息留在你这边,微信还附带多开功能。 ## 📦 安装与首次运行:三步装好 ### 1. 获取程序 两种方式任选:从项目的发布页下载编译好的绿色包并解压;或克隆源码: ```bash git clone https://gitco

gitblog_00327的博客 332

功能安全实战系列07-英飞凌TC3xx电源监控开发详解

本文对电源监控(PBIST及MONBIST)开发介绍,步骤详细配合开发中的测试情况,图文并茂,方便理解。

initiallizer的博客 1109

K-Core, K-Shell & K-Crust傻傻分不清楚

K-Core(K-核)就是所有大于等于K的K-Shell的并集;K-Crust(K-皮)就是所有小于等于K的K-shell的并集。

欢迎订阅 -- 小源笔迹 2256

Rails源代码分析(41):ActionView 概览

require action_view/template_handlerrequire action_view/template_handlers/compilablerequire action_view/template_handlers/builderrequire action_view/template_handlers/erbrequire action_view/t

jlaky的专栏 2034

Linux ARM平台开发系列讲解(GPIO子系统) 2.3.2 GPIO子系统常用函数解析

1. 概述 该章节会记录一年常用的GPIO子系统常用函数,会更具情况不断更新 static inline int gpio_get_value(unsigned int gpio) 功能 :用于获取某个GPIO引脚上的值 gpio : gpio引脚号 返回值:非负值,得到的 GPIO 值;负值,获取失败。 static inline void gpio_set_value(unsigned int gpio, int value) static inline int gpio_cansleep(unsi

DSMGUOGUO的博客 668

Rails源代码分析(1):RailsFCGIHandler

按照顺序从CGI开始入手Ruby CGI Doc:The Common Gateway Interface (CGI) is a simple protocol for passing an HTTP request from a web server to a standalone program, and returning the output to the web browser.

jlaky的专栏 1968

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1685

飞牛fnNAS搭建web版微信

摘要:本文介绍了一种通过Docker在飞牛NAS上部署微信客户端的方法,实现24小时同步微信聊天记录。具体步骤包括:1)激活飞牛NAS的Docker功能并配置镜像加速源;2)创建专用文件夹并下载docker-wechat镜像;3)设置容器参数并部署微信客户端;4)通过局域网或ZeroTier内网穿透实现远程访问。相比传统Windows/Linux方案,该方法资源占用更低,适合需要长期保存微信聊天记录的用户。

dgnankai的专栏 3333

Rails源代码分析(7):ActionController::Filter(1)

Filter类似于钩子方法,在调用某个controller方法之前、之后或者包围调用这个方法,很有用的方法,利用这个可以很大幅度的减少代码量。1 先研究下种类:1.1 before_filter 多用于验证之类的    #     before_filter :verify_credentials    #    #     private    #       def verify_creden

jlaky的专栏 1630

【推荐100个unity插件之27】推荐5种办法实现unity人物布料系统 衣服裙子飘动 头发飘动 胸部抖动 骨骼模拟 配件摆动 尾巴摆动 —— 主要是Magica Cloth 2插件

要实现Unity中的人物布料系统并使其具备动态效果,可以探索多种技术方法。这些方法不仅可以使衣服、裙子、头发等元素自然飘动,还可以实现胸部抖动、骨骼模拟、配件摆动和尾巴摆动等细致效果。本文将深入探讨五种实现这些动态效果的技术方案,从基础的物理模拟到高级的动画控制,帮助你打造逼真的人物表现。本文主要探究Magica Cloth 2的使用,因为我想探究最好的实现方法,而不是探究最多的实现方法。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 6302

Rails源代码分析(15):ActionController::Helpers

1 如何使用默认情况下MyController自动包含MyHelper,add_template_helper 方法可以用来添加自定义的helper Module如果想另外添加,可以用 helper 方法来指定:    # ==== Examples    # The +to_s+ method from the Time class can be wrapped in a helper meth

jlaky的专栏 1369

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Rails源代码分析(8):ActionController::Filter(2)

1 概述    昨天主要看了如何使用Filter,今天看看Filter的实现。    这个Module实现中包含这几块: 1 FilterChain 提供了管理Filter对象的方法 2 Filter 所有Filter基类3 AroundFilter  继承自  Filter4 BeforeFilter  继承自  Filter5 AfterFilt

jlaky的专栏 872

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Rails源代码分析(2):分发器 Dispatcher

写了两遍~ 受不了这个网站      # Backward-compatible class method takes CGI-specific args. Deprecated      # in favor of Dispatcher.new(output, request, response).dispatch.      def dispatch(cgi = nil, session_op

jlaky的专栏 803

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Rails源代码分析(9):ActionController::Filter(3)

主要看看如何添加到ActionController的1 ClassMethods    module ClassMethods           ########################################      # The passed filters will be appended to the filter_chain and      # will ex

jlaky的专栏 679

Rails源代码分析(11):ActionController::Layout(2)

    module ClassMethods      # If a layout is specified, all rendered actions will have their result rendered      # when the layout yields. This layout can itself depend on instance variables assigne

jlaky的专栏 589

Rails源代码分析(20):ActionController::Caching(4) FragmentCache

1 应用Fragment是用来cache一个block的时候使用的,常用于一个页面的页面一部分变化,一部分不变化的情况,       Hello @name %>       do %>         All the topics in the system:         :partial => "topic", :collection => Topic.find(:all) %>     

jlaky的专栏 584

Failed to load module script:服务器回的是 text/html

当模块脚本(<script type="module">)请求的资源返回 200 状态但 Content-Type 为 text/html 时,浏览器因严格 MIME 检查而拒绝加载,报错“Expected a JavaScript-or-Wasm module script but received text/html”。该问题常见于缺失的 chunk 被服务器错误返回 index.html。与经典脚本不同,模块脚本始终强制检查 MIME 类型,即使状态码成功也无效。import() 的拒绝仅提示 Fai

qq_40822000的博客 175

GPT Image 2 出的 UI 图如何转成 HTML 和可编辑 Figma

AI 生成的 UI 图,本身只是起点。用 Codex 或 Claude Code 把它变成 HTML,就有了能演示的页面;用 html.to.design 把 HTML 导回 Figma,就有了能沉淀的设计源文件;用 Codia 直接把图转成 Figma,则适合只要设计稿、追求速度的场景。三条链路互相补充,组合起来就形成了"图、代码、设计稿"之间的闭环。同时也要清楚它的边界:单张位图缺少精确数值,像素级还原目前还做不到稳定;图里的文字和图标需要人工把关。

JEECG官方博客 233

开源项目推荐:2027 高考志愿填报指北|开源单页 HTML 高报资料工具书

高考志愿填报信息量大、维度多,考生与家长往往面临资料零散、信息不对称、优质内容收费门槛高等问题。《2027 高考志愿填报指北》是雪人老师开源的高报笔记资料汇编,将 683 篇、280.5 万字的原创笔记整合为单页 HTML 电子书,覆盖专业、院校、城市、填报攻略四大板块。支持左侧折叠导航、快速跳转、浏览器原生 A4 打印,可在线阅读也可本地保存使用,采用 CC BY-NC 4.0 协议开源,非商业场景可自由传播改编,是高考志愿填报阶段实用的免费参考工具书。关键词:高考志愿填报;高报资料;开源电子书;

Admans的专栏 304

网页 HTML 基础入门:从基本结构到表单实战

HTML 是网页开发的第一步,掌握基本结构、常用标签、超链接、图片和表单后,就可以独立写出简单的静态页面。先熟悉 HTML 基本结构,养成规范书写习惯。练习常用标签,尤其是链接、图片和表单。遇到不熟悉的标签,随时查阅 W3School 手册。掌握 HTML 之后,可以继续学习 CSS 美化页面,以及 JavaScript 实现交互,逐步进入完整的前端开发领域。

TAOZE123的博客 356

纯静态HTML项目文件打包成war包

纯静态HTML项目文件打包成war包

bjzhang75的博客 216

一个简单的js javascript+html字幕浮动窗口

【代码】一个简单的js javascript+html字幕浮动窗口。

大话程序员 24

HTML 转 Word API:HTML 与 URL 输入、DOCX 输出和版式核对

HTML 转 Word API 可把 HTML 正文或公开网页转为可编辑的 DOCX。请求用 type 指定输入类型,用 content 传正文或地址。可选择公开链接或归属当前应用的私有文件引用。

DevOpenClub 专栏 256
上一篇: Rails源代码分析(13):ActionController::Rescue
下一篇: Rails源代码分析(15):ActionController::Helpers
jlaky
博客等级 码龄19年 5粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值