【问题标题】:Rails MonkeyPatch changes not being picked upRails MonkeyPatch 更改未被拾取
【发布时间】:2013-05-22 11:01:38
【问题描述】:

我正在尝试在我的实现中使用“MonkeyPatch”this 控制器,以便它可以处理第三个参数(“productname”)。

gem中原来的activate方法是这样的

def activate
  if Digest::MD5.hexdigest(params["security_data"] + SaasySimple.config.secret) == params["security_hash"]
    SaasySimple.config.model.activate( params['token'], params['id'] )
  end
end

我的整个新文件,放在 lib/monkeys/sassysimple.rb 中,读取

module SaasySimple
  class SubscriptionsController < ApplicationController
    def activate
      if Digest::MD5.hexdigest(params["security_data"] + SaasySimple.config.secret) == params["security_hash"]
        SaasySimple.config.model.activate( params['token'], params['id'], params['productname'] )
      end
    end
  end
end

这不起作用 - 我仍然收到 subscriptions#activate (ArgumentError) "wrong number of arguments (2 for 3)" 的错误,我认为这是因为我的用户方法(见下文)期待 productname 但没有从未安装猴子补丁的版本中得到它。有人能告诉我为什么将文件放在 lib 中不起作用吗?谢谢!

这是用户方法:

  def self.activate(token, id, productname)
    user = User.find( id )
    user.token = token
    user.status = 'active'
    user.package = productname
    user.save!
  end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 gem monkeypatching


    【解决方案1】:
    • 您是否已验证控制器确实可以看到所有三个参数?
    • User#activate 是否在代码的其他任何地方调用?例如grep 为它。

    【讨论】:

    • 不,user#activate 仅由 SaasySimple 调用。我将如何验证第一个问题?我可以看到它们是由 SaaSy 发出的 Post 请求发送的,然后由 SubscriptionsController 处理并发送到用户模型(在这种情况下不发送)。
    【解决方案2】:

    我会将猴子补丁放在 config/initializers/sassysimple.rb 中

    【讨论】:

    • 然后尝试使用您的方法创建一个扩展 SaasySimple::SubscriptionsController 的新控制器
    • 另外,不确定扩展 ApplicationController 是否可以在猴子补丁中使用,这是不必要的
    • 新控制器的想法不错——我把代码放在class ActivationsController &lt; SaasySimple::SubscriptionsController。但它并没有解决问题 - 仍然得到An ArgumentError occurred in subscriptions#activate: wrong number of arguments (2 for 3) .bundle/gems/ruby/1.8/bundler/gems/SaasySimple-c41847cc58ac/app/controllers/saasy_simple/subscriptions_controller.rb:8:in activate'`
    • 你monkeypatch SaasySimple.config.model.activate 接受3 个参数了吗?因为这就是错误的原因。
    • 我认为 config.model 位只是指向 User 模型(在 SaasySimple 初始化程序中有一个 @model = User 来设置它)。正如我在上面编写的那样,我在 User 模型中有代码,看起来它应该接受三个参数。
    猜你喜欢
    • 2018-07-14
    • 2015-01-10
    • 1970-01-01
    • 2022-10-18
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多