事情的起因:前段时间闲赋在家(这段时间也是……),想练练手。觉得JavaEye的子域名挺有意思,就想仿照做个博客,把子域名用进去。子域名插件用SubdomainFu。结果代码写好了,测试时发现问题了。
我要写一个before_filter方法,在进入控制器之前校验一下子域名。方法名叫check_subdomain,因为比较通用,放在application.rb中。
先看控制器application的代码
# RAILS_ROOT/app/controllers/application.rb
class ApplicationController < ActionController::Base
# 为了简洁,其他代码都删了,只留了关键部分
# 这个设置可以使session跨域,但只能是 anysubdomain.myblog.com
session :session_domain => "myblog.com"
include AuthenticatedSystem
before_filter :login_required
protected
# 对用户的后台管理页面,检查子域名必须和用户login相同,否则跳转到404页面
def check_subdomain
unless current_user && current_user.login == current_subdomain
render_404
return false
end
end
# 简陋的处理,返回404页面
def render_404
render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
end
end
上面的check_subdomain方法要在个人的博客管理控制台相关的控制器中,作为before_filter使用。比如,在categories控制器中,它处理“分类管理”的功能。
# RAILS_ROOT/app/controllers/categories_controller.rb
class CategoriesController < ApplicationController
# 这里做一个校验
before_filter :check_subdomain
# 相信有博客的朋友都会熟悉这个url吧,这是“分类管理”
# GET /admin/categories
def index
@categories = current_user.categories.ordered
end
end
这个逻辑很简单,在进入“分类管理” 页面之前,做个校验,判断子域名和当前用户的login相同。校验通过后,根据当前用户,找到所有分类,然后显示页面。
好了,现在我想测试CategoriesController的index方法,这需要使用功能测试(Functional Test),代码如下:
# RAILS_ROOT/test/functional/categories_controller_test.rb
class CategoriesControllerTest < ActionController::TestCase
fixtures :users, :categories
def setup
# 假设当前用户为alex
@alex = users(:alex)
end
test "index" do
# 这里设置下session,以便通过登录校验
get :index, {}, :user_id => @alex.id
assert_response :success
assert_template "index"
end
end
本该显示index页面,但是因为check_subdomain,跳转到404页面去了
ruby -I test test/functional/categories_controller_test.rb -n test_index
...
Expected response to be a <:success>, but was <404>
错误原因在于使用get方法发起提交时,默认是没有子域名的,而且get方法中也没有办法设置url。找了很多地方,最后在一个国外帖子里发现了解决办法。就是用 request.host
来设置域名。
改进的测试代码如下:
# RAILS_ROOT/test/functional/categories_controller_test.rb
class CategoriesControllerTest < ActionController::TestCase
def setup
@alex = users(:alex)
# 利用Request对象的host属性来设定子域名,奇怪的是Rails API中没说明host是个属性,也没找到host=这个方法……
#
# 敏捷开发3rd居然没有说可以用@request,@controller之类的实例变量
# 如果哪位知道这方面的介绍,还请告之,谢谢。
@request.host = "#{@alex.login}.myblog.com"
end
# 测试是否可以正确获取子域名
test "subdomain" do
get :index
assert_equal @alex.login, @controller.send(:current_subdomain)
end
test "index" do
get :index, {}, :user_id => @alex.id
assert_response :success
assert_template "index"
end
end
改进后测试通过,一切正常。
另外,子域名的问题在集成测试(Integration Test)中也有,但集成测试中设置子域名是一件很简单的事情,代码如下:
class AddBlogTest < ActionController::IntegrationTest
fixtures :all
# 测试子域名
test "subdomain" do
# 第一种方法,指定host,host!方法是集成测试专有的方法,功能测试则没有提供
host! "alex.myblog.com"
get "/admin/blogs"
# 第二种方法,在url中加入子域名
# get "http://alex.myblog.com/admin/blogs"
assert_equal "alex", controller.send(:current_subdomain)
end
end
顺便补上Rspec版的controller测试代码,个人觉得Rspec换汤不换药,但写法倒是很舒服:
# RAILS_ROOT/spec/controllers/categories_controller_spec.rb
require 'spec_helper'
describe CategoriesController do
fixtures :users
before :each do
@alex = users(:alex)
# 和Rails的功能测试一样,只是Rspec中用request而非@request
request.host = "#{@alex.login}.myblog.com"
end
it "should tell you the subdomain" do
controller.send(:current_subdomain).should == @alex.login
end
end
参考资料
Testing subdomains as account keys
How to simulate a login into a specific subdomain
分享到:
相关推荐
Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...
同时,由于正则表达式的复杂性,编写和测试它们时应格外小心,确保覆盖所有可能的边缘情况。`RegexProofness`这个文件名可能包含的是各种正则表达式的测试用例,用于确保我们的验证函数在不同输入下都能正常工作。
在Linux中,文件权限是非常重要的安全措施之一,通过设置不同的权限可以有效地保护文件不被非法访问。 1. **`chmod octal file`**:更改文件权限。 - 示例:`chmod 755 myscript.sh` 将 `myscript.sh` 的权限设置...
本报告由艾普思咨询发布,详细分析了2023年5月中国房地产行业的舆情状况。主要内容涵盖行业发展简报、舆情态势(声量/情感分布、来源/媒介分布、典型报道、地域分布)、品牌舆情关注度TOP10以及重点舆情话题和事件。报告指出,5月份房地产行业舆情声量显著上升,达到27,344,454篇次,主要受政策调整、企业动态等因素影响。此外,报告特别关注了万达集团大规模裁员传闻和光明房地产集团原董事长沈宏泽接受审查调查两大重点事件。 房地产从业者、投资者、政策研究者及相关媒体从业人员。
内容概要:本文详细介绍了利用戴维南模型结合遗忘因子递推最小二乘(FFRLS)和扩展卡尔曼滤波(EKF)算法,实现电池参数和荷电状态(SOC)的在线联合估计。首先,通过FFRLS算法实时更新电池模型参数(如R0、Rp、Cp),确保模型能够适应电池的老化和环境变化。接着,EKF算法利用最新的参数估计SOC,解决了传统EKF因参数不准确而导致的估计偏差问题。文中还讨论了算法的具体实现细节,包括参数初始化、协方差矩阵设置、遗忘因子的选择以及针对不同工况的优化措施。此外,文章提供了实测数据对比,展示了联合估计方法相比单一EKF算法的优势,特别是在低温和电流突变等复杂工况下的表现。 适合人群:从事电池管理系统(BMS)开发的技术人员,尤其是对电池参数和SOC估计有研究兴趣的工程师。 使用场景及目标:适用于电动汽车、储能系统等领域,旨在提高电池参数和SOC估计的准确性,从而优化电池管理和延长电池寿命。 其他说明:文章强调了实际应用中的调试技巧,如使用示波器监测突变、MATLAB进行离线验证等,并指出在嵌入式设备(如STM32F407)上的性能优化方法。
内容概要:本文详细介绍了如何使用COMSOL进行二维电磁超声Lamb波仿真的具体步骤,特别针对金属板材检测的新手用户。首先,从建立几何模型开始,包括设置板厚、板长等参数。然后,介绍物理场耦合设置,如电磁场和结构力学之间的洛伦兹力耦合。接着,讲解了激励信号的选择和网格剖分的技术要点。此外,文中还提供了求解器配置的方法以及后处理阶段如何分析仿真结果,包括提取位移信号并进行FFT变换。最后,给出了一些实用的操作技巧和常见错误提示。 适合人群:初学者和有一定COMSOL使用经验的研究人员和技术人员。 使用场景及目标:帮助用户掌握电磁超声Lamb波的基本原理及其在COMSOL中的实现方法,能够独立完成简单板材检测任务。 其他说明:文中不仅涵盖了详细的仿真步骤,还包括了许多实践经验分享,有助于提高用户的实际操作能力。
HAL库BootLoader通过FLASH进行双APP升级
m3u8文件
1、响应式界面 2、页面布局合理,采用网络神板“笔趣阁”的布局,层次分明,结构清晰 3、页面色彩文艺,网站色彩搭配素雅、干净、不伤眼睛,文艺小清新范 4、版本支持会员中心及支付宝支付 5、2.4版本下vip章节支持 6、模板自适应 运行环境 php5.6+mysql 内附详细安装教程。
内容概要:本文详细介绍了基于中颖SH367309芯片的锂电池保护板设计方案,涵盖硬件设计、PCB布局、代码实现等方面。硬件设计部分强调了电压采集电路、均衡电路、温度检测电路以及MOS管驱动电路的关键设计要点;PCB布局则关注模拟和数字地的分割、走线规范等问题;代码实现部分讨论了电压校准、过压保护、通信协议、均衡控制等核心算法的实现。此外,还提供了调试经验和常见问题解决方案,如过流保护算法优化、低温均衡异常处理等。 适合人群:从事锂电池管理系统开发的技术人员,尤其是有一定硬件设计和嵌入式编程经验的工程师。 使用场景及目标:适用于需要开发高性能、高可靠性的锂电池保护板的企业和个人开发者。主要目标是帮助读者掌握SH367309芯片的应用,提高产品的稳定性和性能。 其他说明:文中提供的完整工程文件可在GitHub上获取,方便读者进行实践和参考。建议读者在实际开发过程中结合具体应用场景灵活运用文中提到的各种技术和技巧。
内容概要:本文详细介绍了基于Matlab/Simulink平台构建的7自由度电动汽车整车模型及其主动前轮转向控制系统(AFS)的设计与优化方法。首先,文章阐述了7自由度整车模型的建立,包括车辆的动力学特性和轮胎力学模型。接着,深入探讨了滑模控制器的设计,展示了如何通过滑模面和控制量输出公式实现对车辆横摆角速度和质心侧偏角的有效控制。此外,还讨论了联合控制策略的应用,以及如何通过调整参数提高系统的稳定性和响应速度。最后,分享了一些实际调参经验和常见问题的解决方案。 适合人群:从事电动汽车控制系统的研发人员、高校相关专业师生、对车辆动力学和控制理论感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解电动汽车操稳性控制机制的研究者和技术开发者,旨在帮助他们掌握AFS系统的建模方法、优化技巧及实际应用中的注意事项。 其他说明:文中提供了丰富的实例和详细的代码片段,便于读者理解和实践。同时提醒读者注意仿真过程中可能出现的问题及解决办法。
内容概要:本文详细介绍了Halcon与C#联合开发的一个稳定版本的工业视觉框架。首先强调了环境配置的重要性,确保Halcon的runtime版本与开发环境一致,避免常见的dll版本不匹配问题。接着阐述了图像处理流水线的设计,利用Task+async/await提高效率并避免界面卡顿。文中展示了如何通过状态机实现流程引擎,使配置文件定义处理步骤更加灵活。此外,文章深入探讨了内存管理和异常处理的最佳实践,如使用using语句确保HRegion对象正确释放,以及将Halcon的错误码转化为易读信息。最后,作者分享了一些实用技巧,如通过WCF实现算法和服务化通信,以及提供了一个PCB板检测的Demo项目作为实例。 适合人群:具有一定编程基础,尤其是熟悉C#和Halcon的开发人员,以及从事工业视觉项目的工程师。 使用场景及目标:适用于希望深入了解Halcon与C#联合开发的工业视觉框架的技术人员。主要目标是帮助读者掌握图像处理流程、内存管理、异常处理等方面的知识,从而能够构建高效稳定的工业视觉系统。 其他说明:文中提供了大量代码片段和实践经验,有助于读者更好地理解和应用相关技术。同时,提醒读者在实际开发过程中需要注意的一些常见问题及其解决方案。
内容概要:本文探讨了利用插电式电动汽车(PEV)提高电网暂态稳定性的方法和技术。文中详细介绍了通过Python脚本与PSS/E软件的结合,实现对电网中发电机转速偏差的实时监测,并据此调整附近PEV的充放电功率,以快速响应电网扰动,保持系统稳定。具体措施包括设定合理的转速检测阈值、根据扰动强度非线性调整调节系数、动态调整仿真步长以及引入电池健康管理系统,确保PEV在提供辅助服务的同时不会因频繁充放电损害电池寿命。此外,还讨论了未来将更多分布式储能资源整合进电网的可能性。 适合人群:从事电力系统自动化、智能电网研究的专业人士,以及对电动汽车与电网互动感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解如何利用现代信息技术改善传统电力系统性能的研究机构或企业。主要目标是探索一种创新的技术路径,使得电动汽车不仅作为交通工具存在,还能成为电网稳定运行的重要组成部分。 其他说明:文中提到的方法已经在新英格兰39节点系统进行了初步验证,证明了其有效性。同时强调了通信延迟对于此类控制系统的影响,并提出了相应的解决办法。
内容概要:本文围绕嵌入式设备固件安全分析展开讨论,涵盖了嵌入式设备面临的攻击层面、固件获取和自动化解析、固件安全分析技术(包括静态分析、符号执行、二进制漏洞关联、动态分析平台和模糊测试)等方面的最新研究成果。文章详细分析了各技术的特点、应用场景及优劣势,并对未来的研究方向进行了展望。嵌入式设备因其复杂性和专用性,给安全分析带来诸多挑战,如底层硬件平台的复杂异构、专用性强、源码/文档不公开、运行环境受限等。尽管近年来在固件安全分析方面取得了一些进展,但仍有许多开放性问题亟待解决。 适合人群:从事嵌入式系统安全研究的专业人士、安全分析师、网络安全研究人员、高校师生及相关领域的科研工作者。 使用场景及目标:①帮助研究人员深入了解嵌入式设备固件安全分析的现状和发展趋势;②为开发人员提供安全防护建议,提高嵌入式设备的安全性;③为企业和机构提供安全评估和风险管理的理论依据。 其他说明:本文强调了嵌入式设备固件安全分析的重要性,并指出了当前研究中的不足和未来的发展方向。
内容概要:本文详细介绍了某厂商开源的360V电动汽车高压电机控制器的技术细节。涵盖了硬件设计、FOC算法实现、Bootloader设计以及强大的上位机调试工具。硬件方面,采用高质量元器件如英飞凌IGBT驱动芯片和精密电流采样设计,确保系统稳定性和高性能。软件部分展示了完整的FOC算法实现,包括Clarke变换、Park变换、PI调节和SVPWM生成等关键步骤。Bootloader支持USB+CAN双模刷机,增强了系统的灵活性和可靠性。上位机工具提供了实时波形捕获、自动参数整定等功能,极大提高了调试效率。 适合人群:从事电动汽车电机控制系统开发的工程师和技术爱好者。 使用场景及目标:适用于希望深入了解电动汽车高压电机控制器设计和实现的研究人员和开发者。目标是掌握先进的FOC算法实现方法、硬件设计技巧以及高效的调试工具使用方法。 其他说明:文中提到的所有源码和硬件设计文件均可在GitHub上获取,项目名称为'EV_360V_Platform'。建议重点关注motor_controller/algorithm目录下的观测器算法和上位机调试工具的功能特性。
matlab
内容概要:本文档为京东方科技有限公司发布的关于型号为NV173FHM-N4G V8.0的17.3英寸全高清TFT-LCD模块的产品规格说明书初稿。该模块采用非晶硅薄膜晶体管作为开关器件,支持2车道eDP接口,分辨率为1920×1080像素,显示颜色深度为16.7百万色,色彩覆盖率45%,内置LED驱动电路,适用于笔记本电脑。文档详细介绍了模块的一般描述、电气特性、光学特性、信号时序规范、电源序列、连接器描述、机械特征、可靠性测试以及处理注意事项等内容。此外还提供了详细的EDID表和其他附录信息。 适合人群:电子设备制造商、硬件工程师、采购商以及其他需要了解LCD显示屏技术参数的专业人士。 使用场景及目标:用于指导LCD模块的设计、生产和应用,确保符合客户的技术要求并提供可靠的操作指南。 其他说明:本规格书属于机密文件,未经许可不得复制或传播,且应在请求时归还给京东方公司。
《串口调试工具SerialDebugTool_v1.0详解与应用》 串口通信在嵌入式系统、工业控制以及各种设备间的通信中扮演着至关重要的角色。为了方便开发者进行串口调试,出现了许多专业的串口调试工具,其中SerialDebugTool_v1.0是一款功能强大、易于使用的串口调试助手。本文将深入探讨该工具的功能特性、使用方法及其在实际应用中的价值。 让我们了解SerialDebugTool_v1.0的核心功能。此工具主要提供以下关键特性: 1. **实时数据传输**:SerialDebugTool_v1.0支持实时发送和接收串口数据,这对于测试和调试串口通信协议至关重要。用户可以实时查看接收的数据,同时通过输入框发送自定义数据,实现双向通信。 2. **波特率设置**:工具允许用户根据设备需求调整波特率,常见的波特率如9600、115200等,以适应不同设备的通信速率。 3. **数据位、停止位和校验位配置**:SerialDebugTool_v1.0支持设置数据位(5、6、7、8位)、停止位(1、1.5、2位)以及奇偶校验位,确保与不同设备的兼容性。 4. **数据格式转换
matlab