我使用带有自己的JavaScript和样式表资源的gem.此gem使用标准的application.js和application.css清单来要求其所有资产:
[gem]/app/assets/javascripts/gem_name/application.js
require_tree .
[gem]/app/assets/javascripts/gem_name/backoffice/menu.js
… some JavaScript code …
[gem]/app/assets/javascripts/gem_name/backoffice/forms.js
… some JavaScript code …
Run Code Online (Sandbox Code Playgroud)
在开发模式中,我可以通过将它们放在[my_app]/app/assets文件夹中来覆盖单个资产文件,例如:
[my_app]/app/assets/javascripts/gem_name/backoffice/menu.js
Run Code Online (Sandbox Code Playgroud)
然后在Rails中配置的加载路径确保[my_app]/app/assets覆盖文件中的文件[gem]/app/assets.
但是当我使用预编译资产时rake assets:precompile,覆盖文件menu.js不会替换gem中的原始文件.编译application.js包含原始代码menu.js.
请参阅此测试应用程序的行为:https://github.com/widescape/AssetCompileTest
到目前为止,我发现,require_tree查找文件,只在当前文件的目录,也没有跨多个负载路径(如应用程序/资产或供应商/资产)的样子.因此,如果当前文件是[gem]/app/assets/javascripts/gem_name/application.js,Sprockets#require_tree将只查找[gem]/app/assets/javascripts/gem_name/更多文件,不会使用其他加载路径,如[my_app]/app/assets/….
我不愿意将gem中的所有资产文件复制到我的app/assets中,以覆盖单个文件.并且分支宝石来定制单个文件也没有很大的吸引力.
还有其他方法吗?
注意:我知道我可以创建一个自定义JavaScript文件menu_patched.js来覆盖原始文件中定义的对象和方法,并将其放置,以便在调用原始对象和方法之前应用其定义(猴子修补JavaScript样式).但我在这里寻找一个更清洁的解决方案.
我简单的RubyMotion代码:
data = DataParser.parse(url)
error_ptr = Pointer.new(:object)
json = NSJSONSerialization.JSONObjectWithData(data, options: 0, error: error_ptr)
Run Code Online (Sandbox Code Playgroud)
url是一个天气API,提供JSON温度如浮点数{ "temp_c":22.4, ... }.奇怪的是,浮动22.4转换为22.3999938964844.
如果我检查data.to_s温度读数22.4,那么我认为错误在于NSJSONSerialization.JSONObjectWithData.
我不想强迫所有花车四舍五入.