【问题标题】:Rifinements or monkey patching rails 4Rifinements 或猴子修补栏杆 4
【发布时间】:2015-02-24 11:10:26
【问题描述】:

我正在使用 rail4 和 ruby​​ 2.0,我想在 ActiveModel::Errors 中添加一个方法 "first_error" 应该在我的整个应用程序中都可用,所以我来了跨越以下两种可能性:

  • 猴子补丁
  • 细化

我仅通过创建初始化程序“custom_model_error.rb”就成功实现了第一种方法

class ActiveModel::Errors
  def first_error
    if !self.first
      return nil
    end
    data = Hash.new
    data['error_code'] = '900'
    data['message'] = self.first.join(' ')
    return data
  end
end

但是当我尝试通过在 lib 目录中定义一个模块来实现第二种方法时:

  module RefineErrors
    refine ActiveModel::Errors do
      def first_error
        if !self.first
          return nil
        end
        data = Hash.new
        data['error_code'] = '900'
        data['message'] = self.first.join(' ')
        return data
      end
    end
  end

然后在ApplicationController中使用这个模块:

class ApplicationController < ActionController::API
   using RefineErrors

我得到错误未定义的方法'使用'

现在我的问题是:

目前最好的实施方法是什么
Monkey Patching 一般不推荐,细化是ruby 2.0的实验特性

还想知道如何使用 rails4 中的改进来实现这一点

如果在这种情况下应该遵循任何其他方法,请同时提及。

【问题讨论】:

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


    【解决方案1】:

    如果你使用的是 ruby​​ 2.0,你需要使用支持优化的 ruby​​ 补丁。看看这里http://timelessrepo.com/refinements-in-ruby
    此链接还共享猴子修补和改进的力量。

    【讨论】:

    • 感谢Ashutosh的帮助,请仔细阅读代码,我想我的实现方式与链接中描述的方式相同,但正如我之前提到的,我得到了未定义的方法“使用”对于 ApplicationController:Class (NoMethodError) 在 ApplicationController 中使用 'using' 关键字时出错。
    • 请检查上面链接的安装部分。问题是您使用的是ruby 2.0的默认补丁(可能是481,它不正确支持它),您需要添加特定的补丁在上面链接的安装部分中提到。如果您尝试使用 ruby​​ 2.1 进行上述操作,您将不会收到错误。
    猜你喜欢
    • 2012-03-13
    • 2013-12-26
    • 2012-06-14
    • 2012-03-29
    • 2016-10-30
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多