如何在Rails控制台的模块中运行私有方法?

时间:2018-07-13 04:03:04

标签: ruby-on-rails

我在帮助文件中的私有方法中出错。辅助文件的模块HxHelper如下所示。我想在Rails控制台中运行method_2,以在本地系统中重新创建错误。

module HxHelper
def method_1{
"key_1": "@h.htype"
"key_2": "value_2"

 + method_2}
end

private
def method_2{
"key1": "value_1"}
end

在我的控制器文件中,我定义了一个新类并包含以前的帮助文件。我尝试了以下方法。

  1. 创建了我的类的对象,分别为obj = Class.newobj.method_1。我在method_1中收到错误的未定义方法类型。炒作是房屋表中的属性。
  2. 尝试过HxHeleper::method_1Error - method_1 is not defined in HxHelper module.
  3. method_2定义为self:无效。

有人可以帮助我了解我在做什么错吗?

2 个答案:

答案 0 :(得分:3)

在此示例中,您有一些语法错误。您要在哈希行的末尾使用逗号,不能将两个哈希加在一起,而需要合并。合并将接收器(您正在调用合并的对象)并覆盖参数中的所有值。此外,在哈希中使用:时,键最终会变成符号,这意味着您不需要引号。

这是定义帮助程序模块的正确方法。

module HxHelper
  def method_1
    {
      key_1: "@h.htype",
      key_2: "value_2",
    }.merge(method_2)
  end

private
  def method_2
    {
      key1: "value_1",
    }
  end
end

然后您可以像这样使用它:

class Test
  include HxHelper
end
t = Test.new
t.method_1

这将返回:

{:key_1=>"@h.htype", :key_2=>"value_2", :key1=>"value_1"}

如果调用t.method_2,则会在调用私有方法时出错。

如果method_2的哈希具有键key_1,则您的返回值为:

{:key_1=>"value_1", :key_2=>"value_2"}

因为自变量中的:key_1覆盖了接收方哈希中的那个。

如果您要调用该私有方法,可以执行以下操作:

t.send(:method_2)

如果您有一个采用参数的方法,则只需将它们添加在方法名称的符号之后:

private
  def test(num1, num2)
    return(num1 + num2)
  end

  send(:test, 1, 2)

这将返回3

答案 1 :(得分:1)

假设我们可以解决您的语法问题,那么“我如何在Ruby中调用私有方法?”的标准答案是什么?与{s {1}}中的.send()一起使用。

手动调试之后,学习编写自动化测试。 Rails为他们提供了业界领先的典范支持。测试将取代您目前正在滥用控制台的实验和调查角色。