【问题标题】:Why isn't this simple Ruby code working in HAML?为什么这个简单的 Ruby 代码不能在 HAML 中工作?
【发布时间】:2013-03-09 21:23:13
【问题描述】:

如果我定期运行这个简单的 Ruby 代码,它可以正常工作:

class String
  def add_two
    self + "2"
  end
end
puts "hello".add_two

它应该打印“hello2”。但这失败了:

:ruby
  class String
    def add_two
      self + "2"
    end
  end
  puts "hello".add_two

此代码产生错误:

NoMethodError at /
undefined method `add_two' for "hello":String

有什么想法吗?

(不确定这是否重要,但我将 HAML 与 Sinatra 一起使用,它在 Apache 上运行,带有 Passenger 模块。)

【问题讨论】:

  • 你可以尝试在puts "hello".add_two" 之前添加puts "Content-type: text/html\n\n"
  • 你在遵循 MVC 架构吗?你为什么要这么做?
  • 我觉得你真的不应该在视图中修补字符串
  • 你做错了,真的 ;)
  • @AJcodez 和其他人:我知道这是不好的做法,我不会在实际程序中这样做,但我仍然想了解为什么这不起作用。是什么让 "monkey-patching" 字符串如此特别以至于它不应该在 HAML 中工作?

标签: ruby sinatra haml


【解决方案1】:

我建议 String 在另一个命名空间中,因此是另一个类。

这会发生什么?

class ::String

【讨论】:

  • 作为参考,这在 Rails 视图中不起作用,但谁在乎,因为它在 Sinatra 中起作用并解决了问题:+1。
【解决方案2】:

我将您的代码按原样放入 Rails 应用程序中的一个 Haml 视图中,但我收到了另一个错误:

SyntaxError at /
class definition in method body

所以我想知道是不是 Haml's :ruby filter 在抱怨,但由于它“使用普通的 Ruby 解释器解析过滤后的文本”,这似乎不太可能。因此,我搜索了有关该错误的更多信息,并找到了导致我这样做的参考(见下文),它有效(但实际上,永远不应该使用):

:ruby
  String.module_eval do
    def add_two
      self + "2"
    end
  end
  puts "hello".add_two

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2013-05-04
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多