Rails:通过插件包含模块的麻烦

时间:2015-03-16 20:19:51

标签: ruby-on-rails ruby ruby-on-rails-3 plugins module

我正在尝试创建一个rails插件,而我遇到的问题是该应用在迁移插件时不会包含我的模块。

这是我到目前为止所得到的:
1.文件lib/patch/settings_helper_patch.rb,扩展名为
2.带有init.rb的{​​{1}}文件 3. require_dependency 'patch/settings_helper_patch'中的一些代码如下:

settings_helper_patch.rb

迁移插件后,我希望使用module ValidateIssuePatch module Patch module SettingsHelperPatch def self.included(base) base.send(:include, InstanceMethods) end module InstanceMethods def issue_options #some code here end end end end end unless SettingsHelper.included_modules.include?(ValidateIssuePatch::Patch::SettingsHelperPatch) SettingsHelper.send(:include, ValidateIssuePatch::Patch::SettingsHelperPatch) end 方法,但出现issue_options错误。

如果我从控制台运行undefined local variable or method,我会得到SettingsHelper.included_modules.include?(ValidateIssuePatch::Patch::SettingsHelperPatch) 但是,如果我从控制台调用ValidateIssuePatch,我会得到uninitialized constant Patch::SettingsHelperPatch作为响应。

谁能告诉我,我在这里失踪的魔力是什么?

1 个答案:

答案 0 :(得分:1)

首先,如果你的模块只有实例方法,我建议使用以下易于理解的语法:

module ValidateIssuePatch
  module Patch
    module SettingsHelperPatch
      def issue_options
        # code
      end
    end
  end
end

SettingsHelper.include(ValidateIssuePatch::Patch::SettingsHelperPatch)

其次,可能定义ValidateIssuePatch的原因是某些其他文件具有正确需要的文件。此文件不以任何方式执行。我会在某个地方引发一个错误,当它被引发时,将验证代码是否正在被执行。如下所示:

module ValidateIssuePatch
  module Patch
    module SettingsHelperPatch
      raise "All good" # remove this afterwards

      def issue_options
        # code
      end
    end
  end
end

SettingsHelper.include(ValidateIssuePatch::Patch::SettingsHelperPatch)

有可能无法提出错误,并且确认您的文件不是必需的 - 要么根本不是,要么不是正确的顺序。

要进一步验证这一点,只需打开控制台并使用现有代码执行以下操作:

ValidateIssuePatch::Patch::SettingsHelperPatch #=> error
require path_of_file
ValidateIssuePatch::Patch::SettingsHelperPatch #=> no more error

最后,为什么要检查SettingsHelper中已包含的模块? (指unless条件)你的代码应该只包含一次模块,而不是#34;也许只有一次"。