【问题标题】:problems upgrading from rails 3.2.16 to Rails 4.0.2 -- NoMethodError - private method `h' called for从 rails 3.2.16 升级到 Rails 4.0.2 的问题——NoMethodError——调用私有方法“h”
【发布时间】:2014-01-18 16:20:41
【问题描述】:

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

我有一个名为 BaseDataTable 的类,如下代码 sn-p 所示:

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

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

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 类并使用相同的技术。

【问题讨论】:

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


    【解决方案1】:

    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 的调用并使用裸字符串。

    【讨论】:

    • 这是有道理的。谢谢。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多