在rails插件中扩展核心类是行不通的

时间:2014-10-20 21:37:19

标签: ruby-on-rails ruby ruby-on-rails-4 rvm minitest

#PLUGIN/lib/#PLUGIN内,我插入了以下内容:

String.class_eval do
  def to_squawk
    "squawk! #{self}".strip
  end
end

当我尝试在Rails控制台中测试时。我收到以下错误:NoMethodError: undefined method to_squawk' for" test string":String`

Loading development environment (Rails 4.2.0.beta2)
2.1.3 :001 > "test string".to_squawk
NoMethodError: undefined method `to_squawk' for "test string":String
  from (irb):1
  from /Users/fab/.rvm/gems/ruby-2.1.3/gems/railties-4.2.0.beta2/lib/rails/commands/console.rb:110:in `start'
  from /Users/fab/.rvm/gems/ruby-2.1.3/gems/railties-4.2.0.beta2/lib/rails/commands/console.rb:9:in `start'
  from /Users/fab/.rvm/gems/ruby-2.1.3/gems/railties-4.2.0.beta2/lib/rails/commands/commands_tasks.rb:68:in `console'
  from /Users/fab/.rvm/gems/ruby-2.1.3/gems/railties-4.2.0.beta2/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
  from /Users/fab/.rvm/gems/ruby-2.1.3/gems/railties-4.2.0.beta2/lib/rails/commands.rb:17:in `<top (required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'

我在这里关注教程:http://guides.rubyonrails.org/plugins.html

有谁知道这里的问题是什么?

1 个答案:

答案 0 :(得分:0)

这是Rails指南中的代码:

String.class_eval do
  def to_squawk
    "squawk! #{self}".strip
  end
end

这是你的代码:

String.class_eval do
  def self.to_squawk
    "squawk! #{self}".strip
  end
end

看到区别? Guide的代码定义了一个String实例响应的实例方法(即"foo".to_squawk # => "squawk! foo"),但是你的stray self代码定义了一个String类响应的类方法(即String.to_squawk # => "squawk! String" )。