Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 导致未定义方法错误的可选参数_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 导致未定义方法错误的可选参数

Ruby on rails 导致未定义方法错误的可选参数,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在Rails中有一个带有实例方法的模型。我希望此方法具有可选参数,但尝试使用可选参数会导致错误: Class MyModel < ActiveRecord::Base def my_method(param1, param2 = another_defined_variable) instance_variable == param2 end end classmymodel

我在Rails中有一个带有实例方法的模型。我希望此方法具有可选参数,但尝试使用可选参数会导致错误:

Class MyModel < ActiveRecord::Base

  def my_method(param1, param2 = another_defined_variable)
    instance_variable == param2
  end
end
classmymodel
现在,在Rails控制台、开发环境或测试环境中,如果使用不同数量的参数调用此方法,将得到以下结果:

my_instace.my_method
# ArgumentError: wrong number of arguments (0 for 2) (expected error)

my_instance.my_method(:some_symbol)
# NameError: undefined local variable or method `my_method' for #<MyModel:0x007fb7a2d9fb50>

my_instance.my_method(:some_symbol, 1)
# Runs as expected.
my\u instance.my\u方法
#ArgumentError:参数数目错误(2为0)(预期错误)
my_实例。my_方法(:某些_符号)
#NameError:未定义的局部变量或方法“my_method”#
my_实例。my_方法(:某些_符号,1)
#按预期运行。

第二个失败的原因是什么?我是否处理得不正确?

我认为您不能将参数默认为变量。为什么不:

def my_method(param1, param2=nil)
  instance_variable == (param2 || another_defined_variable)
end

我认为不能将param默认为变量。为什么不:

def my_method(param1, param2=nil)
  instance_variable == (param2 || another_defined_variable)
end
my\u instance\u方法:
您不能直接调用此方法。您必须创建MyModel类的实例,然后只有您才能调用它

my\u class\u方法:
这是一个类级方法,您可以直接用类名调用它,即
MyModel.my\u class\u方法

关于默认参数:

您可以将其设置为params2=5。这意味着如果您没有为第二个参数传递任何值,那么5将被视为第二个参数值。但是,如果您正在传递任何其他值,那么将为param2指定该值

my\u instance\u方法:
您不能直接调用此方法。您必须创建MyModel类的实例,然后只有您才能调用它

my\u class\u方法:
这是一个类级方法,您可以直接用类名调用它,即
MyModel.my\u class\u方法

关于默认参数:



您可以将其设置为params2=5。这意味着如果您没有为第二个参数传递任何值,那么5将被视为第二个参数值。但是,如果您正在传递任何其他值,那么将为param2分配该值。

当出现错误时,我想到了这一点。我试过了,但是即使使用
param2=nil
,它仍然会产生与上面相同的错误。这应该可以工作。您的代码的细节中肯定还有其他一些地方。@evanbikes:我想澄清一下,您在这方面是正确的(谢谢!),但是这并不是问题的完整解决方案。当出现错误时,我想到了这一点。我试过了,但是即使使用
param2=nil
,它仍然会产生与上面相同的错误。这应该可以工作。您的代码的细节中肯定还有其他方面。@evanbikes:我想澄清一下,您在这一点上是正确的(谢谢!),但这并不是问题的完整解决方案。我有点不清楚这与这个问题有什么关系?在本例中,我使用了一个实例方法,因为该方法检查对象的一个实例变量。我的错。我将它用于一个方法的实例,而不是像OP中最初显示的那样作为类方法使用(我的示例代码格式错误)。实例方法,在发生错误时对实例调用。你完全明白我的意思!好极了!class方法:have self关键字并按类名调用实例方法:call by object要设置默认参数,请在参数中提及它,如果您输入,这将被任何新值覆盖,否则将捕获默认值。简单明了:)我不太清楚这和这个问题有什么关系?在本例中,我使用了一个实例方法,因为该方法检查对象的一个实例变量。我的错。我将它用于一个方法的实例,而不是像OP中最初显示的那样作为类方法使用(我的示例代码格式错误)。实例方法,在发生错误时对实例调用。你完全明白我的意思!好极了!class方法:have self关键字并按类名调用实例方法:call by object要设置默认参数,请在参数中提及它,如果您输入,这将被任何新值覆盖,否则将捕获默认值。简单明了:)请发布您的实际代码,而不是“示例”代码。我很乐意,但我现在无法发布真实代码:/n您的假代码中的任何内容都不会导致您提到的假名称错误。除非你能给我们更准确的信息,否则我们帮不了你。然而,正如其他人所指出的,默认值必须是文本或常量。您不能在方法签名中使用
=
右侧的变量或方法名称。“我现在不能发布真正的代码”。然后发布一个合理的复制问题的传真。当你请求帮助调试某个东西时,你必须包括演示问题的工作代码,否则你的问题就离题了。@theTinMan:抱歉,试图提出演示问题的合理代码。不幸的是,这需要隔离问题,我目前正试图这样做。我明白,很明显,如果你看不到这个问题,你就无法解决它。我试图以一种方式复制这个问题,使我能够找出它不起作用的原因,或者提供一个合理的演示。还有,为什么要编辑标题?我不知道的格式标准?请发布您的实际代码,而不是“示例”代码。我很乐意,但我现在无法发布真实代码:/n您的假代码中的任何内容都不会导致您提到的假名称错误。除非你能给我们更准确的信息,否则我们帮不了你。然而,正如其他人所指出的,默认值必须是文本或常量。不能在方法签名中使用
=
右侧的变量或方法名称