我是新来的轨道,使某种小白错误的:我经常需要计算文件中的行数,所以我想给猴子补丁类文件是这样的:
class File
def self.line_count( filename )
%x{wc -l #{filename}}.split.first.to_i
end
end
Run Code Online (Sandbox Code Playgroud)
我把它保存到/lib/file_util.rb.我认为这应该是自动要求的,所以我可以使用它,但这不起作用:
$ rails console
>> File.line_count('Gemfile')
NoMethodError: undefined method `line_count' for File:Class
...
Run Code Online (Sandbox Code Playgroud)
所以我尝试手动要求它,没有快乐:
>> require '<myproj>/lib/file_util.rb' # same result with require 'file_util.rb'
=>nil
Run Code Online (Sandbox Code Playgroud)
但是如果我在IRB中需要它,它会起作用:
$ irb
>> require '<myproj>/lib/file_util.rb'
=> true
>> File.line_count('Gemfile')
=> 22
Run Code Online (Sandbox Code Playgroud)
我还尝试将require添加到config/application.rb:
...
Bundler.require(:default, Rails.env) if defined?(Bundler)
require 'file_util.rb'
module <myproj>
...
Run Code Online (Sandbox Code Playgroud)
我得到:
$ rails console
<myproj>/config/application.rb:9:in `require': no such file to load -- file_util.rb (LoadError)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
在单元测试中,我需要测试alias_method定义的别名方法是否已正确定义.我可以简单地对用于原始的别名使用相同的测试,但我想知道是否有更明确或有效的解决方案.例如,有没有办法1)取消引用方法别名并返回其原始名称,2)获取并比较某种基础方法标识符或地址,或3)获取和比较方法定义?例如:
class MyClass
def foo
# do something
end
alias_method :bar, :foo
end
describe MyClass do
it "method bar should be an alias for method foo" do
m = MyClass.new
# ??? identity(m.bar).should == identity(m.foo) ???
end
end
Run Code Online (Sandbox Code Playgroud)
建议?
在一堆rspec rails单元规格中,我做了类似的事情:
describe Foo do
[:bar, :baz].each do |a|
it "should have many #{a}" do
Foo.should have_many(a)
end
end
end
Run Code Online (Sandbox Code Playgroud)
为了更清洁的代码,我宁愿做类似的事情:
describe Foo do
spec_has_many Foo, :bar, :baz
end
Run Code Online (Sandbox Code Playgroud)
那么如何编写一个辅助方法,比如spec_has_many()插入像rspec 方法那样的DSL代码it()呢?如果它是一个普通的实例方法,我会做类似的事情:
def spec_has_many(model, *args)
args.each do |a|
define_method("it_should_have_many_#{a}") do
model.should have_many(a)
end
end
end
Run Code Online (Sandbox Code Playgroud)
定义rspec示例的等价物是什么?
在运行时的方法中,有没有办法知道是否已super在子类中调用该方法?例如
module SuperDetector
def via_super?
# what goes here?
end
end
class Foo
include SuperDetector
def bar
via_super? ? 'super!' : 'nothing special'
end
end
class Fu < Foo
def bar
super
end
end
Foo.new.bar # => "nothing special"
Fu.new.bar # => "super!"
Run Code Online (Sandbox Code Playgroud)
我怎么写via_super?,或者,如果有必要的话via_super?(:bar)?
我没有config.active_record.whitelist_attributes = true应用程序配置.我有attr_protected()模特课.但是,我注意到id和type属性会自动插入ActiveModel::MassAssignmentSecurity::BlackList.这对id属性有意义,因为我们不想设置id质量赋值,但为什么type属性也是如此?
我正在从感染了各种奇怪字符的外部数据库导入内容,例如
> str
=> "Nature’s Variety, Best Friends Animal Society team up"
Run Code Online (Sandbox Code Playgroud)
从上下文中似乎’表示右单引号.在cp1252编码中:
> str.encode('cp1252')
=> "Nature\xE2\x80\x99s Variety, Best Friends Animal Society team up"
Run Code Online (Sandbox Code Playgroud)
那么如何将其转换为正确的UTF-8字符呢?这是我尝试过的:
> str.encode('UTF-8')
=> "Nature’s Variety, Best Friends Animal Society team up"
> str.encode('cp1252').encode('UTF-8')
=> "Nature’s Variety, Best Friends Animal Society team up"
> str.encode('UTF-8', invalid: :replace, replace: '?', undef: :replace)
=> "Nature’s Variety, Best Friends Animal Society team up"
> str.encode('cp1252').encode('UTF-8', invalid: :replace, replace: '?', undef: :replace)
=> "Nature’s Variety, Best Friends Animal …Run Code Online (Sandbox Code Playgroud) 我想将一个整数编码为基数36,然后将其解码为基数10.编码步骤很简单:
12345.to_s(36)
=> "9ix"
Run Code Online (Sandbox Code Playgroud)
现在我想将其解码回基数为10的整数.但这不起作用:
"9ix".to_i(10)
=> 9
Run Code Online (Sandbox Code Playgroud)
那我怎么写
def base36to10(b36)
# ?
end
Run Code Online (Sandbox Code Playgroud)
以便
r = rand(100000)
base36to10(r.to_s(36)) == r
Run Code Online (Sandbox Code Playgroud)
?