小编Mor*_*ori的帖子

Rails 3:如何在/ lib中加载文件?

我是新来的轨道,使某种小白错误的:我经常需要计算文件中的行数,所以我想给猴子补丁类文件是这样的:

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)

我究竟做错了什么?

require autoload ruby-on-rails-3

11
推荐指数
2
解决办法
1万
查看次数

是否有一种优雅的方法来测试一个实例方法是否是另一个实例的别名?

在单元测试中,我需要测试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)

建议?

ruby reflection alias-method

11
推荐指数
1
解决办法
1655
查看次数

如何编写插入rspec示例的方法?

在一堆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示例的等价物是什么?

ruby rspec helpermethods

6
推荐指数
1
解决办法
1448
查看次数

当前的Ruby方法是通过super调用的吗?

在运行时的方法中,有没有办法知道是否已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)

ruby metaprogramming subclass super ruby-2.3

5
推荐指数
1
解决办法
144
查看次数

名为"type"的模型属性会自动插入到ActiveModel :: MassAssignmentSecurity :: BlackList中

我没有config.active_record.whitelist_attributes = true应用程序配置.我有attr_protected()模特课.但是,我注意到idtype属性会自动插入ActiveModel::MassAssignmentSecurity::BlackList.这对id属性有意义,因为我们不想设置id质量赋值,但为什么type属性也是如此?

ruby-on-rails ruby-on-rails-3.2

4
推荐指数
1
解决办法
2339
查看次数

在Ruby中,如何使用UTF-8编码这个奇怪的角色?

我正在从感染了各种奇怪字符的外部数据库导入内容,例如

> 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)

ruby encoding utf-8

4
推荐指数
1
解决办法
3024
查看次数

如何将整数从基数36转换为基数10?

我想将一个整数编码为基数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)

ruby

3
推荐指数
1
解决办法
1777
查看次数