从rails 3.2.16升级到Rails 4.0.2的问题 - NoMethodError - 调用私有方法`h'

时间:2014-01-18 16:20:41

标签: ruby-on-rails-3.2 ruby-on-rails-4

我正在尝试从Rails 3.2.16应用程序升级到Rails 4.0.2并遇到以下问题。

我有一个名为BaseDataTable的类,如下面的代码片段所示:

class BaseDatatable
  delegate  :h, :link_to, to: :@view
  ...
end

然后我调用上面委托的h方法(除了link_to)来自继承自BaseDatatable的类,如下所示:

class TypeWellsDatatable < BaseDatatable

  private

  def row(type_well)
    ret_array = []
    ...
    ret_array << h(phases)
    ...
  end
  ...
end

这在Rails 3.2.16中运行良好,但在Rails 4.0.2中抛出以下错误:

NoMethodError - private method `h' called for #<#<Class:0x00000107c8d2c0>:0x00000100ed8310>:
  app/datatables/base_datatable.rb:2:in `h'
  app/datatables/type_wells_datatable.rb:22:in `row'
  app/datatables/base_datatable.rb:13:in `block in as_json'
  activerecord (4.0.2) lib/active_record/relation/delegation.rb:13:in `map'
  app/datatables/base_datatable.rb:13:in `as_json'
  activesupport (4.0.2) lib/active_support/json/encoding.rb:50:in `block in encode'
  activesupport (4.0.2) lib/active_support/json/encoding.rb:81:in `check_for_circular_references'
  activesupport (4.0.2) lib/active_support/json/encoding.rb:49:in `encode'

似乎ActiveSupport gem在Rails 4.0.2中将此方法设为私有,这对我来说没有任何意义(或者我只是不明白)。我的问题是:绕过这个问题的侵入性最小的方法是什么?还有许多其他类继承自BaseDatatble类并使用相同的技术。

1 个答案:

答案 0 :(得分:8)

h当然是html_escape的别名。从Rails 3开始,所有字符串都被html转义为by default。 Rails 4 documentation仍然将html_escape显示为ActiveView :: Base(实际上是ERB :: Util)上的公共方法,但在我正在使用的Rails的4.0.2版本中,view_context返回 false 回应?。

Rails 4不再允许您明确调用html_escape并不会让我感到惊讶。这与转移到白名单一致,这意味着您必须声明字符串安全,以便它们不会被转义。否则,我们认为它们不安全。

Net你可以摆脱你对h的调用并使用裸字符串。