- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 lib 目录中有一个设置,如下所示:
lib/
copy_process.rb
copy_process/
processor.rb
copy_process.rb 和 processor.rb 包含模块定义 CopyProcess。 copy_process.rb 也定义了 CopyFile 类:
module CopyProcess
class CopyFile
end
end
processor.rb 的结构如下:
module CopyProcess
class Processer
end
end
在其中一个方法中,它创建了一个新的复制文件对象:
def append_file_if_valid(file_contents, headers, files, file_name)
unless headers
raise "Headers not found"
else
files << CopyProcess::CopyFile.new()
end
end
当我将这些文件用作命令行 ruby 程序的一部分时,它运行良好。但是,我开始将它放入 Rails 应用程序中,并且我编写了 Cucumber/capybara 测试来点击按钮等使用它的地方。我从我的一个 AR 模型中初始化一个 Processor 对象,并多次调用上述方法。它似乎找不到 CopyFile 类,即使我的 application.rb 中有以下代码
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
有什么想法吗?
============================================= ================
编辑 上面的问题是通过将复制文件类提取到它自己的 lib 文件中来解决的。我现在有另一个问题:
CopyFile 类引用位于 lib/copy_process.rb 中的模块级辅助方法,如下所示:
module CopyProcess
# Gets the index of a value inside an array of the given array
def get_inner_index(value, arr)
idx = nil
arr.each_with_index do |e, i|
if e[0] == value
idx = i
end
end
return idx
end
def includes_inner?(value, arr)
bool = false
arr.each { |e| bool = true if e[0] == value }
return bool
end
# Encloses the string in double quotes, in case it contains a comma
# @param [String] - the string to enclose
# @return [String]
def enclose(string)
string = string.gsub(/\u2019/, '’')
if string.index(',')
return "\"#{string}\""
else
return string
end
end
end
当我运行我的 cucumber 测试时,出现以下错误:
undefined method `includes_inner?' for CopyProcess:Module (NoMethodError)
./lib/copy_process/copy_file.rb:64:in `set_element_name_and_counter'
这里指的是这个方法:
def set_element_name_and_counter(element_names, name)
if !CopyProcess::includes_inner?(name, element_names)
element_names << [name, 1]
else
# if it's in the array already, find it and increment the counter
current_element = element_names[CopyProcess::get_inner_index(name, element_names)]
element_names[CopyProcess::get_inner_index(name, element_names)] = [current_element[0], current_element[1]+1]
end
element_names
end
我还尝试将 lib/copy_process/目录中的 copy_file.rb 和其他文件向上移动到 lib 目录中。然后我收到以下错误:
Expected /Users/aaronmcleod/Documents/work/copy_process/lib/copy_file.rb to define CopyFile (LoadError)
./lib/processor.rb:48:in `append_file_if_valid'
错误声明的行创建了一个 CopyFile 实例。我猜 rails 不喜欢以这种方式加载文件,对于以前的设置,我认为 copy_file.rb 在加载模块的其余部分时遇到问题。我试过要求它等等,但没有运气。您还可以在这里找到我最近的代码:https://github.com/agmcleod/Copy-Process/tree/rails
最佳答案
首先 config.autoload_paths += %W(#{config.root}/lib)
应该足够了。这会告诉 Rails 开始在/lib 中寻找结构正确的文件。
其次,我认为您遇到了问题,因为 CopyFile
不是 Rails 期望的位置。据我所知,您的设置“应该”有效,但您是否尝试过将 CopyFile
分离到 copy_process 文件夹下的自己的文件中?我的猜测是,因为 copy_process 文件夹存在,所以它期望所有 CopyProcess::*
类都在那里定义,而不是 copy_process.rb。
编辑:您可以考虑打开另一个问题,但问题的后半部分完全是一个不同的问题。
您可以像这样在模块中定义方法,
module X
def method_one
puts "hi"
end
end
这种形式的方法是模块上的实例方法,它们有非常特殊的限制。例如,您不能从模块定义之外访问它们(我怀疑它们以前是如何工作的)。执行上面给出
> X::method_one
NoMethodError: undefined method `method_one' for X:Module
如果您想从其他范围访问这些方法,您有几个选择。
使用类方法
module X
def self.method_one
puts "hi"
end
end
X::hi #=> "hi"
使用Mixins
module X
module Helpers
def method_one
puts "hi"
end
end
end
class CopyFile
include X::Helpers
def some_method
method_one #=> "hi"
self.method_one #=> "hi"
end
end
关于ruby-on-rails - 在 lib 目录的模块中使用类 - Rails 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930018/
根据 g++ -print-search-dirs,我的 C++ 编译器正在许多目录中搜索库,包括 ... /lib/../lib/: /usr/lib/../lib/: /库/: /usr/lib/
我在 GLUT 演示的顶部看到了代码,我很好奇它的功能。 为什么有人要编写#pragma 而不是只包含库? 最佳答案 此 pragma 允许库作者根据一系列可在编译时分析的标准定义库导入。例如,您可以
Intel describes libm.lib 作为静态库,libmmt.lib 作为多线程静态库 (/MT) 和 libmmds.lib 作为多线程静态库 (/MD) 都实现了 LibM Math
我在 Windows 7 32 位上使用 Visual Studio 2010。 我在 http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-
我正在尝试将一些 html 转换为 pdf。经过一些谷歌搜索后,我发现 dompdf但是当我尝试转换时,我会检索 PHP-font-lib must either be installed via c
目前我的visual studio基本上是在生成Engine.dll和Game.exe Engine.dll 链接到其他一些基本库,例如:d3dx9d.libComCtl32.libWinMM.lib
我正在尝试将 material-ui 用于项目。使用它时会抛出以下错误: 我曾尝试通过 github 存储库解决类似问题,但没有任何运气。任何人都有任何想法可能是什么问题?我正在添加 package.
为了简化,我有两个库:libA.lib、libB.lib libA 具有以下功能: void read(num,*val){ *val=Globalval[num]; ... } libB: void
我有一个包含两个项目的 VS2010 解决方案。第一个项目 [DevLib] 是一个库,它基本上是另一个我们没有源代码的库 [ExtLib] 的包装器。构建这个库工作正常。 第二个项目 [TestAp
我想用我做了一些小更改的系统库替换它。这两个库都是使用相同版本的cyanogenmod 源代码编译的。我复制到 SD 卡的那个可以在早期的 CM 闪存上运行。 现在我尝试运行以下命令: $ adb s
我正在使用源代码中的Postgres 13(Rel_13_STRATE分支),并且我使用的是来自apachea/age源代码的(Release/PG13/1.3.0分支)中的1.3.0版的Apache
看起来 Jetty 团队想要在版本 6 和 7 之间进行一些 Spring 清理,并且看起来好像一个有用的系统属性“jetty.lib”不存在、不起作用,或者只是在未指定的情况下发生了更改以便使我的
我正在尝试使用 unixODBC 连接到 Oracle,但它不起作用。到目前为止,我已经尝试关注 How do I setup Oracle ODBC drivers on RHEL 6/Linux
我在我的 Linux Mint 14 Nadia 中安装了 Matlab(a uname -a 显示:Linux Ideapad-Z570 3.5.0-17-generic#28-Ubuntu SMP
我有一个需要使用 macdeployqt 设置的应用程序,但是当我调用它时,它告诉我它无法在/usr/lib/目录中找到一些库。 在调用 macdeployqt 之前,我必须将 3 个库 (.tx)
此特定问题是由于指定对路径中包含空格的 lib 文件的依赖项引起的。路径需要用引号括起来,项目才能正确编译。 在项目属性的Configuration Properties -> Linker -> I
我正在努力尝试让 OpenCV 2.2 库与我的项目(运行 VSC++,2010)一起工作。我按照 http://opencv.willowgarage.com/wiki/VisualC%2B%2B
总而言之,我想要的是避免在多个 .dll 中出现重复的 .lib 文件,因为生成的 .dll 将在一个 .exe 文件中一起使用,这会使 .lib 文件中的全局状态重复。 具体问题: 我有一个包含 3
我正在尝试使用 Intel TBB 和 IPP 构建 OpenCV v2.3.1。我使用 CMake 生成 Visual Studio 2010 解决方案。构建成功,我在输出中有 opencv_cor
我不明白 use local::lib 经常做 use lib 没有。有人可以解释一下吗? 最佳答案 常规 use lib foo几乎就像这样简单: BEGIN { unshift(@INC, foo
我是一名优秀的程序员,十分优秀!