每天一剂Rails良药之javascript_test

本文介绍了一个 Rails 插件 javascript_test,它提供了一种简便的方法来为 JavaScript 文件创建单元测试。通过简单的命令行操作即可生成测试用例,并且能够自动运行所有测试。
今天来看看javascript_test这个Rails plugin,它是对script.aculo.us库的单元测试框架的Rails风格测试封装
下载安装后,我们可以使用[b]ruby script/generate javascript_test foo[/b]来对public/javascripts/foo.js生成测试用的html文件
在测试用的html文件里我们可以写对JavaScript的测试,语法见[url]http://wiki.script.aculo.us/scriptaculous/show/UnitTesting[/url],如:
[code]
testExample: function() { with(this) {
var myElement = $('mydiv');
assertEqual("DIV", myElement.tagName);
assertEqual("DIV", myElement.tagName, "Hmm, not a DIV?");
}};
[/code]
然后我们可以使用[b]rake test:javascripts[/b]来自动运行所有JavaScript单元测试

我们通过javascript_test这个插件来看看怎样写generators
该插件的generator文件为javascript_test/generators/javascript_test/javascript_test_generator.rb
[code]
class JavascriptTestGenerator < Rails::Generator::NamedBase

def manifest
record do |m|
m.directory File.join("test","javascript")
m.template 'javascript_test.html', File.join('test/javascript', "#{name}_test.html")
end
end
end
[/code]
我们要继承Rails::Generator::NamedBase基类,#{name}即可在字符串中得到运行script/generate javascript_test时的参数

以及怎样写rake
该插件的rake文件为javascript_test/tasks/javascript_test.rake
[code]
desc "Run tests for JavaScripts"
task 'test:javascripts' => :environment do
JavaScriptTest::Runner.new do |t|

t.mount("/", RAILS_ROOT)
t.mount("/test", RAILS_ROOT+'/test')
t.mount('/test/javascript/assets', RAILS_ROOT+'/vendor/plugins/javascript_test/assets')

Dir.glob('test/javascript/*_test.html').each do |js|
t.run(File.basename(js,'.html').gsub(/_test/,''))
end

t.browser(:safari)
t.browser(:firefox)
t.browser(:ie)
t.browser(:konqueror)
end
end
[/code]
内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
<think>嗯,用户想了解Rails中的javascript_include_tag的参数及其作用。这个问题看起来是关于Rails框架的前端资源加载机制,属于比较具体的开发实践问题。 参考提供的两个站内引用,可以看出关键信息点:引用[1]提到js文件的存放位置变化和基本用法,引用[2]补充了单个页面加载JS/CSS的配置细节。虽然用户说这些引用不是真实需求,但内容确实与问题直接相关。 用户可能正在处理前端资源加载的问题,或者需要优化现有Rails应用的资源管理。考虑到javascript_include_tag是Rails视图层的基础helper,用户可能是初中级开发者,需要明确参数用法来避免生产环境部署时的常见错误。 从技术维度看,需要解释清楚几个核心点:基础参数用法(文件名处理)、多个文件加载方式、路径配置规则、依赖管理参数(tree功能)、以及生产环境特殊处理(digest指纹)。特别要注意强调Asset Pipeline机制带来的变化,因为新旧版本Rails在这方面差异较大。 用户没有明确说明Rails版本,但根据引用中提到了Assets Pipeline,应该默认按Rails 3.1+版本解释。需要提醒.scss文件后缀这个容易忽略的细节(如引用[2]所述),这对CSS引入也同样适用。 可以准备几个相关问题:关于manifest文件配置、如何调试加载问题、不同环境差异处理等实用场景。这些应该能覆盖用户后续可能遇到的痛点。 </think>好的,我们来详细解释 Rails 中的 `javascript_include_tag` Helper 方法,包括其参数和作用。 ### Rails 中的 `javascript_include_tag` 参数及其作用 `javascript_include_tag` 是 Rails 提供的一个视图 Helper 方法,专门用于在 HTML 页面中生成加载 JavaScript 文件的 `<script>` 标签。它的核心作用是将存储在 `app/assets/javascripts`、`lib/assets/javascripts`、`vendor/assets/javascripts` 目录下的 JavaScript 文件(或其编译后的版本)正确地嵌入到 HTML 中。这在 Asset Pipeline 机制下尤为重要。 #### 主要参数及其作用 1. **基础参数:源文件名称 (Source Names)** * **作用:** 指定要加载的一个或多个 JavaScript 文件(不带 `.js` 扩展名)。 * **格式:** 可以是一个字符串,或多个字符串组成的数组。 * **示例:** ```erb <%= javascript_include_tag 'application' %> <!-- 加载 application.js --> <%= javascript_include_tag 'custom', 'charts' %> <!-- 加载 custom.js 和 charts.js --> ``` * **路径查找:** Rails 会自动在上述提到的资产目录中查找这些文件。默认查找位置是 `app/assets/javascripts` [^1]。 2. **`:defer` 参数** * **作用:** 向生成的 `<script>` 标签添加 `defer` 属性。 * **效果:** 脚本会在文档解析完成之后、`DOMContentLoaded` 事件触发之前执行,且保持它们在 HTML 中出现的顺序。不会阻塞 HTML 解析。 * **格式:** `defer: true` * **示例:** ```erb <%= javascript_include_tag 'analytics', defer: true %> ``` 3. **`:async` 参数** * **作用:** 向生成的 `<script>` 标签添加 `async` 属性。 * **效果:** 脚本会异步加载,一旦可用立即执行。执行顺序无法保证(谁先下载完谁先执行),可能阻塞 HTML 解析和执行。 * **格式:** `async: true` * **示例:** ```erb <%= javascript_include_tag 'ad-script', async: true %> ``` * **注意:** `async` 和 `defer` 通常不同时使用。 4. **`:data` 参数** * **作用:** 向生成的 `<script>` 标签添加任意的自定义 HTML5 `data-*` 属性。 * **格式:** `data: { key: value }`,这里的键会自动转换为 `data-key`。 * **示例:** ```erb <%= javascript_include_tag 'widget', data: { turbo_track: 'reload', custom_id: 'widget123' } %> <!-- 生成: <script src="/assets/widget.js" data-turbo-track="reload" data-custom-id="widget123"></script> --> ``` 5. **`:type` 参数** * **作用:** 指定 `<script>` 标签的 `type` 属性。现代浏览器默认支持 `text/javascript`,通常不需要指定。主要用于非标准类型(如旧的 `text/ecmascript`)或模块(`module`)。 * **格式:** `type: 'value'` * **示例:** ```erb <%= javascript_include_tag 'es6-module', type: 'module' %> ``` #### 关键作用总结 1. **自动化路径生成:** 开发者只需提供文件名(不带路径和扩展名),Rails 会自动根据 Asset Pipeline 的配置(如 `assets.paths`)找到正确的文件路径。这在开发和生产环境(文件名带摘要指纹)下尤其方便 [^1]。 2. **处理依赖关系(通过 Sprockets):** 如果传入单个文件名(如 `'application'`),并且 `application.js` 文件包含 Sprockets 指令(如 `//= require jquery`, `//= require_tree .`),`javascript_include_tag` 最终会生成加载所有所需依赖项的文件链接(在开发环境是多个文件,在生产环境通常是一个合并压缩后的单一文件)。这是 Asset Pipeline 的核心功能之一。 3. **生成正确的 HTML 标签:** 简化了在视图中手动书写 `<script src="...">` 标签的过程,确保语法正确。 4. **支持高级属性:** 通过参数(`defer`, `async`, `data`)轻松添加现代 `<script>` 标签属性,优化页面加载性能和提供额外数据。 5. **环境感知:** 在开发环境中,通常会生成多个单独的 `<script>` 标签以方便调试(如果使用了 `require` 指令)。在生产环境中,Asset Pipeline 会自动将其预处理、压缩、合并(如果配置了)并添加内容摘要指纹(digest fingerprint)到文件名中以防止缓存问题 [^1]。 #### 使用场景示例 1. **加载主应用 JS:** `javascript_include_tag 'application'` - 加载 `application.js` 及其所有依赖。 2. **加载特定页面 JS:** ```erb <!-- app/views/posts/show.html.erb --> <%= javascript_include_tag 'posts' %> ``` 这会加载 `app/assets/javascripts/posts.js` (或 `posts.coffee` 等)。 3. **加载外部 JS(CDN)并带备用:** ```erb <%= javascript_include_tag "https://cdn.example.com/library.min.js", integrity: "sha256-...", crossorigin: "anonymous" %> ``` 4. **添加异步加载和自定义数据:** ```erb <%= javascript_include_tag 'analytics', async: true, data: { track: 'pageview' } %> ``` #### 重要注意事项 * **Asset Pipeline 是关键:** `javascript_include_tag` 的行为高度依赖于 Rails 的 Asset Pipeline(由 Sprockets gem 实现)。理解 `app/assets/javascripts` 的目录结构、`manifest` 文件(如 `application.js`)和 `require` 指令是有效使用它的前提 [^1]。 * **生产环境预编译:** 在上线到生产环境前,必须运行 `rails assets:precompile` 命令。这将根据 `manifest` 文件编译、合并、压缩 JS 并添加摘要指纹。`javascript_include_tag` 在生产环境会自动引用这些编译后的带指纹的文件 [^2]。 * **与 `stylesheet_link_tag` 对比:** 它是加载 CSS 文件的对应 Helper (`<%= stylesheet_link_tag 'application' %>`),作用相似但用于 `<link rel="stylesheet">` 标签 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值